Domanda

Recentemente abbiamo attivato uno dei nostri tavoli di InnoDB e ora stiamo vivendo molto lenti tempi di esecuzione UPDATE. Un aggiornamento che usato per prendere 0.010-0.030 secondi può ora prendere più di 70 secondi. Alcune query vengono eliminati perché non possono acquisire un blocco entro il limite predefinito di 50 secondi (mi rendo conto che siamo in grado di aumentare questo limite).

La tabella in questione ha un solo indice, la chiave primaria stessa, che è un valore MEDIUMINT. Il tavolo ha circa 1 milione di righe. Tutti di aggiornamento in questo contesto comportano una sola riga. Solitamente 4-5 colonne di tale riga sono influenzati in ogni query.

my.cnf attuale viene incollato sotto. Vedete tutto ciò che potrebbe causare una performance particolarmente UPDATE male per 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

UPDATE:
innodb_log_file_size: 5242880
have_innodb: SI
"DOVE" clausola guarda sempre per una sola colonna, che è la chiave primaria.

UPDATE - 26 luglio 2012:
Abbiamo cambiato la nostra banca dati per mysql 5.5. Ora aggiornamenti InnoDB sono abbastanza veloce, meno di 0,010 secondi nel nostro caso specifico. E, la varianza è piuttosto bassa. Il mio prendere da questo è: InnoDB deve essere usato con cautela reale su MySQL 5.0.

È stato utile?

Soluzione

PROSPETTIVA # 1

Quando si aggiorna tramite chiave primaria solo in InnoDB, c'è un'occasione rara, ma possibile quando l'indice cluster (aka gen_clust_index ) può ottenere bloccato.

Una volta ho risposto tre messaggi da un individuo su questo tema

Si prega di leggere attentamente tali. Il manifesto di queste domande ha trovato la sua soluzione sulla base del comportamento vedere InnoDB Clustered Index bloccaggio. Purtroppo, non pubblicare ciò che la soluzione era.

Inoltre, quando si vede le query in esecuzione lenta, accedere a mysql e SHOW ENGINE INNODB STATUS\G corsa e l'avvio alla ricerca di serrature nell'indice cluster.

PROSPETTIVA # 2

Ti vedo commentata innodb_log_file_size . Lo avete a 5 MB, il default. Dal momento che innodb_buffer_pool_size è impostato a 1G, innodb_log_file_size ha bisogno di essere a 256M. Clicca qui per andare sull'impostazione innodb_log_file_size per 256M .

PROSPETTIVA # 3

Vedo che non si utilizza innodb_file_per_table . Si consiglia di utilizzarlo in modo da avere aggiornamenti della tabella fatto appositamente per quella tabella con un milione di righe. Clicca qui per vedere come infrastruttura di Clean Up InnoDB da usare innodb_file_per_table .

Altri suggerimenti

  1. Si stanno aggiornando il valore del valore della chiave primaria?

  2. Sono una delle colonne chiavi esterne ad altre tabelle? Dal momento che InnoDB aggiorna anche chiavi esterne nella stessa transazione tramite la CASCADE.

  3. Si può aumentare l'innodb_buffer_pool_size a più di 1 GB in modo che l'intera tabella può andare bene nella memoria?

  4. Quanti altri tavoli sono in schmea - dal momento che ci possono essere problemi di ridimensionamento lo spazio tabella di effettuare l'aggiornamento

  5. Si può provare a utilizzare il innodb_file_per_table in cui viene creato un file di tabella per ogni tabella. Una volta che si cambia questo parametro è necessario riavviare il server, quindi creare il database di nuovo perché abbia effetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top