Acelere las inserciones de MySQL con particiones en MyISAM con una clave única
9
Tengo una gran tabla MyISAM (~ 30 millones de filas). En algún momento lo cambié a un formato de fila fijo, por lo que ahora la tabla toma ~ 40 Gb en disco y 2 Gb para índices. La tabla tiene un índice único y hay 100 consultas de 'inserción en actualización de clave duplicada' por segundo. A medida que la mesa crece, estos insertos se vuelven cada vez más lentos.
No estoy seguro, pero ¿las particiones me ayudarán a acelerar las inserciones?
En primer lugar, las escrituras concurrentes definitivamente no son una opción para el almacenamiento MyISAM. Cada uno de ellos bloqueará una mesa completa (excepto para leer en algunos casos). Si InnoDB no se adapta bien a usted, intente TokuDB. Pero será más lento en comparación con MyISAM debido a la naturaleza transaccional del motor TokuDB (e InnoDB, por supuesto) (debe escribir los mismos datos al menos dos veces: diario y archivos de datos). Además, si su servidor fallará algún día, esperará horas hasta que su mesa MyISAM de 40 Gb se repare.
Si aún desea cargar datos en sus tablas MyISAM y desea hacerlo rápido, le puedo recomendar que use en LOAD DATA INFILElugar de inserciones. Esta es la forma más rápida de cargar grandes volúmenes de datos a la tabla. Y sí, los índices ralentizarán el rendimiento de inserción de manera exponencial.
Una palabra acerca de las particiones: las instrucciones INSERT en MySQL no admiten la poda, por lo que todas sus particiones se escanearán en cada instrucción para una coincidencia de índice única. Además, todas las particiones se bloquearán hasta que finalice la inserción.
¿Son estas consultas de inserción concurrentes u originadas en el mismo proceso? Si son concurrentes, es mejor usar el almacenamiento de InnoDB para esta tabla porque MyISAM bloquea toda la tabla e InnoDB utiliza bloqueos de fila. Si cambiar a otro almacenamiento no es una opción, puede probar la instrucción INSERT DELAYED y otras optimizaciones de inserción . Particionar no ayudará a menos que coloque diferentes particiones en diferentes discos físicos.
Estas inserciones son concurrentes. Pero InnoDB es demasiado lento en 'insertar en actualización de clave duplicada', por lo que no es una opción. Por lo que puedo decir, IO no es un cuello de botella: la cantidad de RAM >> tamaño de las tablas, incluidos los índices y el almacenamiento en caché de escritura, está activado. Creo que el problema se encuentra en algún lugar de las cerraduras internas de mysql o algo así.
d0rc
INSERT DELAYED debe usarse solo para las instrucciones INSERT que especifican listas de valores. El servidor ignora las declaraciones RETARDADAS para INSERT ... SELECT o INSERT ... ON DUPLICATE KEY UPDATE.
llazzaro
"InnoDB es demasiado lento", ¿ha intentado ajustarlo un poco? La configuración predeterminada es bastante pobre.
¿Son estas consultas de inserción concurrentes u originadas en el mismo proceso? Si son concurrentes, es mejor usar el almacenamiento de InnoDB para esta tabla porque MyISAM bloquea toda la tabla e InnoDB utiliza bloqueos de fila. Si cambiar a otro almacenamiento no es una opción, puede probar la instrucción INSERT DELAYED y otras optimizaciones de inserción . Particionar no ayudará a menos que coloque diferentes particiones en diferentes discos físicos.
fuente