Question

Nous avons récemment mis un de nos tables InnoDB et maintenant nous vivons ACTUALISATION temps d'exécution très lent. Une mise à jour qui permet de prendre 0.010-0.030 secondes peut maintenant prendre plus de 70 secondes. Certaines requêtes sont abandonnées parce qu'ils ne peuvent pas acquérir un verrou dans le défaut 50 secondes limite (je sais que nous pouvons augmenter cette limite).

Le tableau en question n'a qu'un seul indice, la clé primaire lui-même qui est une valeur MEDIUMINT. Le tableau a environ 1 million de lignes. Tout est UPDATE dans ce contexte impliquent une seule ligne. Habituellement 4-5 colonnes de cette ligne sont affectées à chaque requête.

my.cnf actuel est collé ci-dessous. Est-ce que vous voyez quelque chose qui pourrait notamment causer une mauvaise performance UPDATE InnoDB?

[mysqld]
set-variable=local-infile=0

datadir=/db/mysql/data
socket=/var/lib/mysql/mysql.sock
#log = /var/log/mysqld.log
log-error = /var/log/mysqld.error.log
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1


skip-locking
key_buffer = 1G
query_cache_size = 256M
thread_cache_size = 128
table_cache = 2048
max_connections = 400
query_cache_limit = 1024M
log_slow_queries = /var/log/mysql-slow.log
long_query_time = 1
skip-bdb
skip-locking
skip-name-resolve

innodb_buffer_pool_size=1G
innodb_additional_mem_pool_size=20M
innodb_flush_log_at_trx_commit=2
#innodb_log_file_size=250M
innodb_log_buffer_size=8M
innodb_lock_wait_timeout=50


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Mise à jour: innodb_log_file_size: 5242880
have_innodb: OUI
clause « where » regarde toujours pour une seule colonne, qui est la clé primaire.

Mise à jour - le 26 Juillet, 2012: Nous avons amélioré notre base de données MySQL 5.5. Maintenant, les mises à jour InnoDB sont assez rapide, moins de 0,010 secondes dans notre cas spécifique. Et, la variance est assez faible. Mon point de vue est de ce InnoDB doit être utilisé avec prudence réelle sur MySQL 5.0.

Était-ce utile?

La solution

PERSPECTIVE # 1

Lorsque vous mettez à jour par clé primaire que dans InnoDB, il y a une occasion rare mais possible lorsque l'index ordonné en clusters (aka gen_clust_index ) peut se verrouillé.

Une fois, je répondais trois postes de un individu sur ce sujet

S'il vous plaît lire attentivement. L'affiche de ces questions a trouvé sa propre solution basée sur le comportement de verrouillage voir index cluster InnoDB. Malheureusement, il n'a pas affiché ce que la solution était.

En outre, quand vous voyez les requêtes en cours d'exécution lent, connectez-vous SHOW ENGINE INNODB STATUS\G MySQL et exécuter et à partir à la recherche de serrures dans l'index cluster.

PERSPECTIVE # 2

Je te vois commenté innodb_log_file_size . Vous avez à 5MB, la valeur par défaut. Depuis innodb_buffer_pool_size est réglé sur 1G, innodb_log_file_size doit être à 256M. Cliquez ici pour aller sur la configuration innodb_log_file_size à 256M .

PERSPECTIVE # 3

Je vois que vous n'utilisez pas innodb_file_per_table . Vous pouvez l'utiliser afin d'avoir des mises à jour de table fait spécifiquement pour une table avec un million de lignes. Cliquez ici pour voir comment nettoyer l'infrastructure InnoDB utiliser innodb_file_per_table .

Autres conseils

  1. Vous mettez à jour la valeur de la valeur de clé primaire?

  2. sont l'une des colonnes clés étrangères à d'autres tables? Depuis InnoDB met également à jour les clés étrangères dans la même transaction via le CASCADE.

  3. Pouvez-vous augmenter la innodb_buffer_pool_size à plus de 1 Go de sorte que toute la table peut tenir dans la mémoire?

  4. Combien d'autres tableaux sont en schmea - car il peut y avoir des problèmes Redimensionnement de la tablespace pour mener à bien la mise à jour

  5. Vous pouvez essayer d'utiliser le innodb_file_per_table où un fichier tablespace est créé pour chaque table. Une fois que vous modifiez ce paramètre, vous devez redémarrer votre serveur, créez votre base de données à nouveau pour qu'elle prenne effet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top