2010-02-08 32 views
17

Tenemos una serie de tablas que han crecido orgánicamente a varios millones de filas, en producción hacer una inserción o actualización puede tomar hasta dos segundos. Sin embargo, si vuelco la tabla y la vuelvo a crear a partir de las consultas de volcado son muy rápidas.¿Por qué las inserciones/actualizaciones de MySQL InnoDB en tablas grandes son muy lentas cuando hay pocos índices?

Hemos reconstruido una de las tablas creando una copia reconstruyendo los índices y luego haciendo un cambio de nombre y copiando sobre cualquier nueva fila, esto funcionó porque esa tabla solo se adjunta. Al hacerlo, las inserciones y actualizaciones se hicieron más rápidas.

Mis preguntas:

¿Por qué los insertos de ser lento en el tiempo? ¿Por qué volver a crear la tabla y hacer una importación corregir esto? ¿Hay alguna forma de que pueda reconstruir índices sin bloquear una tabla para las actualizaciones?

+1

motor de almacenamiento? Sistema de archivos? La versión de MySQL? ¿Son los registros muy grandes? – ggiroux

+0

Lo siento, debería haber incluido esto en cuestión. InnoDB, XFS en una matriz de bandas con 15k discos. – Greg

Respuesta

8

Suena como que es o

  • Índice de desequilibrar con el tiempo
  • La fragmentación del disco
  • archivo de datos InnoDB interno (s) la fragmentación

podría intentar analyze table foo que no tiene cerraduras , solo unas pocas inmersiones de índice y toma unos segundos.

Si esto no lo arregla, puede utilizar

mysql> SET PROFILING=1; 
mysql> INSERT INTO foo ($testdata); 
mysql> show profile for QUERY 1; 

y debería ver donde la mayor parte del tiempo se dedica.

Aparentemente, innodb funciona mejor cuando las inserciones se hacen en orden PK, ¿es este tu caso?

+0

¿Tiene algún enlace a información sobre desequilibrio de índices? También creo que puedes estar en algo con el disco fragmentado ... Voy a investigar esto. – Greg

+0

Recuerdo haber sido golpeado por este http://bugs.mysql.com/bug.php?id=43660, que es más un caso de "estadísticas de índice incorrectas en plataformas de 64 bits", pero eso puede conducir al mismo tipo de cuestiones. – ggiroux

1

La actualización de una tabla requiere que se reconstruyan los índices. Si está haciendo inserciones en bloque, intente hacerlas en una transacción (como lo hacen el volcado y la restauración). Si la tabla está sesgada por la escritura, pensaría en descartar los índices de todos modos o dejar que un trabajo en segundo plano haga el procesamiento de lectura de la tabla (por ejemplo, copiándolo en uno indexado).

+1

No creo que hayas leído la pregunta, las inserciones/actualizaciones son muy rápidas cuando los índices han sido reconstruidos, es decir. con la tabla de optimización, solo son lentos cuando el crecimiento de la mesa es orgánico. Quiero saber por qué es esto. – Greg

+0

Por alguna razón, estaba predispuesto a hacer actualizaciones masivas, es decir, a veces agregando más filas, a veces agregando menos en ráfagas. ¿Supongo que es rápido tan pronto como sueltas los índices? – hurikhan77

+0

No he intentado con la caída de índices, no puedo hacerlo en producción y tan pronto como importo un volcado en una máquina de prueba, es rápido. Supongo que bajar los índices lo hará rápido. Puedo intentar copiar los archivos de datos a una máquina de prueba para probar esto. – Greg

0

¿Podría deberse a la fragmentación de XFS?

Copiar/pegar de http://stevesubuntutweaks.blogspot.com/2010/07/should-you-use-xfs-file-system.html:

Para comprobar el nivel de fragmentación de una unidad, por ejemplo, se encuentra en/dev/sda6:

sudo xfs_db -c -r frag/dev/sda6

El resultado se verá algo así:

51270 actual, ideal 174, factor de fragmentación 99.66%

Ese es un resultado real que obtuve la primera vez que instalé estas utilidades, que anteriormente no tenían conocimiento del mantenimiento de XFS. Bastante sucio. Básicamente, los 174 archivos en la partición se distribuyeron en 51270 piezas separadas.Para desfragmentar, ejecute el siguiente comando:

sudo xfs_fsr -v/dev/sda6

se deja correr por un tiempo. la opción -v le permite mostrar el progreso. Después de que finalice, trate de comprobar el nivel de fragmentación de nuevo:

sudo xfs_db -c -r frag/dev/sda6

real 176, 174 ideales, factor de fragmentación 1,14%

Mucho mejor!

7

El rendimiento de InnoDB depende en gran medida de la RAM. Si los índices no caben en la RAM, el rendimiento puede disminuir de manera considerable y rápida. Reconstruir toda la tabla mejora el rendimiento porque los datos y los índices ahora están optimizados.

Si solo está insertando en la mesa, MyISAM es más adecuado para eso. No tendrá problemas de bloqueo si solo se agrega, ya que el registro se agrega al final del archivo. MyISAM también le permitirá usar tablas MERGE, que son realmente agradables para desconectar o archivar partes de los datos sin tener que exportar y/o eliminar.

+0

Cita necesaria para "depende en gran medida de la RAM". – Pacerier

+0

Detalles sobre cómo InnoDB [usa memoria] (http://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html). Tenga en cuenta que ha habido grandes mejoras en InnoDB de 5.0 a 5.1, 5.5 y posteriores. –

+0

͏ + 1͏͏͏͏͏͏͏͏͏͏͏͏ – Pacerier

0

rastrear el en uso my.ini y aumentar el key_buffer_size Tenía una tabla de 1.5GB con una tecla grande donde las consultas por segundo (todas las escrituras) habían bajado a 17. Me pareció extraño que en el panel de administración (mientras que la tabla estaba bloqueada para escribir para acelerar el proceso) estaba haciendo 200 lecturas de InnoDB por segundo a 24 escrituras por segundo.

Se forzó a leer la tabla de índice del disco. Cambié key_buffer_size de 8M a 128M y el rendimiento saltó a 150 consultas por segundo completado y solo tuve que realizar 61 lecturas para obtener 240 escrituras. (después del reinicio)

+1

para innoDB, innodb_buffer_pool_size impacta directamente en la cantidad de filas/índices almacenados en la memoria, lo que reduce las búsquedas de colisiones antes de la escritura. – ppostma1

+1

key_buffer_size no tiene ningún efecto para innodb, es una configuración myisam. –

Cuestiones relacionadas