Pregunta

Recientemente cambiamos una de nuestras tablas a innoDB y ahora estamos experimentando tiempos de ejecución de actualizaciones muy lentos. Una actualización que solía tomar 0.010-0.030 segundos ahora puede tomar más de 70 segundos. Algunas consultas se eliminan porque no pueden adquirir un bloqueo dentro del límite predeterminado de 50 segundos (me doy cuenta de que podemos aumentar este límite).

La tabla en cuestión tiene solo un índice, la clave primaria en sí misma que es un valor mediano. La tabla tiene alrededor de 1 millón de filas. Todas las actualizaciones en este contexto implican una sola fila. Por lo general, 4-5 columnas de esa fila se ven afectadas en cada consulta.

Actual my.cnf se pega a continuación. ¿Ves algo que podría causar particularmente un mal rendimiento de actualización para 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

ACTUALIZAR:
innodb_log_file_size: 5242880
have_innodb: sí
"Donde" la cláusula siempre se ve solo para una columna, que es la clave principal.

Actualización - 26 de julio de 2012:
Actualizamos nuestra base de datos a MySQL 5.5. Ahora las actualizaciones de innoDB son bastante rápidas, menos de 0.010 segundos en nuestro caso específico. Y, la varianza es bastante baja. Mi opinión de esto es: Innodb debe usarse con verdadera precaución en MySQL 5.0.

¿Fue útil?

Solución

Perspectiva #1

Cuando actualiza por clave primaria solo en innodb, hay una ocasión rara pero posible cuando el índice agrupado (también conocido como gen_clust_index) puede bloquearse.

Una vez respondí tres publicaciones de un individuo en esta asignatura

Por favor, lea estos cuidadosamente. El póster de esta pregunta encontró su propia solución basada en el comportamiento de bloqueo de índice agrupado Viendo innoDB. Lamentablemente, no publicó cuál era la solución.

Además, cuando vea las consultas que se ejecutan lentamente, inicie sesión en MySQL y ejecute SHOW ENGINE INNODB STATUS\G y comenzar a buscar cerraduras en el índice agrupado.

Perspectiva #2

Veo que comentó innodb_log_file_size. Lo tienes a 5 MB, el valor predeterminado. Ya que innodb_buffer_pool_size se establece en 1G, innodb_log_file_size debe estar a 256 m. Haga clic aquí para configurar innodb_log_file_size a 256m.

Perspectiva #3

Veo que no estás usando innodb_file_per_table. Es posible que desee usarlo para que se realicen actualizaciones de tabla específicamente para una tabla con un millón de filas. Haga clic aquí para ver cómo limpiar la infraestructura innodb para usar innodb_file_per_table.

Otros consejos

  1. ¿Está actualizando el valor del valor de la clave principal?

  2. ¿Alguno de las columnas es claves extranjeras para otras tablas? Dado que InnoDB también actualiza las claves extranjeras en la misma transacción a través de la cascada.

  3. ¿Puede aumentar el innodb_buffer_pool_size a más de 1 GB para que toda la tabla pueda caber en la memoria?

  4. Cuántas otras tablas hay en el Schmea, ya que puede haber problemas para cambiar el tamaño del espacio de tabla para llevar a cabo la actualización

  5. Es posible que desee intentar usar el innodb_file_per_table donde se crea un archivo de espacio de tabla para cada tabla. Una vez que cambie este parámetro, necesita reiniciar su servidor, luego cree su base de datos de nuevo para que surja efecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a dba.stackexchange
scroll top