Definitivamente, debe elegir su enfoque en función del tipo de motor... optimizando para MyISAM o para InnoDB .
Recientemente ejecutamos un punto de referencia comparando diferentes formas de insertar datos y medimos el tiempo desde antes de la inserción y hasta que todos los índices se restauran por completo. Estaba en una tabla vacía, pero usamos hasta 10 millones de filas.
MyISAM con LOAD DATA INFILE
y ALTER TABLE ... ENABLE/DISABLE KEYS
ganó indiscutiblemente en nuestra prueba (en un sistema Windows 7, MySQL 5.5.27 - ahora lo estamos probando en un sistema Linux).
HABILITAR y DESHABILITAR TECLAS no funciona para InnoDB, es solo para MyISAM. Para InnoDB, utilice SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
si está seguro de que sus datos no contienen duplicados (no olvide establecerlos en 1
después de que se complete la carga).
No creo que necesites OPTIMIZE TABLE
después de una inserción masiva:las filas de MySQL se ordenan por inserción y el índice se reconstruye de todos modos. No hay "fragmentación adicional" al hacer una inserción masiva.
Siéntase libre de comentar si cometí errores de hecho.
ACTUALIZACIÓN: De acuerdo con los resultados de nuestras pruebas más recientes y completas, el consejo para DESHABILITAR/HABILITAR las teclas es incorrecto.
Un compañero de trabajo hizo que un programa ejecutara múltiples pruebas diferentes:una tabla con InnoDB / MyISAM prellenado y vacío, velocidades de selección e inserciones con LOAD DATA LOCAL
, INSERT INTO
, REPLACE INTO
y UPDATE
, en tablas "densas" y "fragmentadas" (no estoy muy seguro de cómo, creo que fue en la línea de DELETE FROM ... ORDER BY RAND() LIMIT ...
con una semilla fija para que siga siendo comparable) e índices habilitados y deshabilitados.
Lo probamos con muchas versiones diferentes de MySQL (5.0.27, 5.0.96, 5.1.algo, 5.5.27, 5.6.2) en Windows y Linux (aunque no las mismas versiones en ambos sistemas operativos). MyISAM solo ganaba cuando la mesa estaba vacía. InnoDB fue más rápido cuando los datos ya estaban presentes y, en general, funcionó mejor (excepto por el espacio de disco duro:MyISAM es más pequeño en el disco).
Aún así, para beneficiarse realmente de él, debe probarlo usted mismo, con diferentes versiones, diferentes ajustes de configuración y mucha paciencia, especialmente con respecto a las extrañas inconsistencias (5.0.97 fue mucho más rápido que 5.5.27 con la misma configuración) Todavía estamos buscando la causa). Lo que encontramos fue que DISABLE KEYS
y ENABLE KEYS
son casi inútiles y, a veces, dañinos si no comienzas con una mesa vacía.