Definitivamente debe elegir su enfoque en función del tipo de motor ... optimizando for MyISAM o for InnoDB.
Recientemente ejecutamos un punto de referencia que compara diferentes formas de insertar datos y mide el tiempo transcurrido desde la inserción hasta que todos los índices se restauran por completo. Estaba en una mesa vacía, pero usamos hasta 10 millones de filas.
MyISAM con LOAD DATA INFILE
y ALTER TABLE ... ENABLE/DISABLE KEYS
manos ganadas en nuestra prueba (en un sistema Windows 7, MySQL 5.5.27 - Ahora estamos tratando de que en un sistema Linux).
ENABLE y DISABLE KEYS no funciona para InnoDB, solo es MyISAM. Para InnoDB, use SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
si está seguro de que sus datos no contienen duplicados (no olvide configurarlos en 1
después de completar la carga).
No creo que necesite 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" haciendo una inserción masiva.
Siéntase libre de comentar si cometí errores de hecho.
ACTUALIZACIÓN: Según nuestros resultados de prueba más recientes y completos, el consejo para las teclas DISABLE/ENABLE es incorrecto.
Un compañero de trabajo tenía un programa de ejecutar varias pruebas diferentes - una mesa con InnoDB/MyISAM previamente llenada y vacía, y las inserciones acelera la selección con LOAD DATA LOCAL
, INSERT INTO
, REPLACE INTO
y UPDATE
, en "densos" y mesas "fragmentados" (estoy no estoy muy seguro de cómo, creo que fue a lo largo de las líneas de DELETE FROM ... ORDER BY RAND() LIMIT ...
con una semilla fija por lo que todavía es comparable) y los índices habilitados y convertibles.
Lo probamos con muchas versiones de MySQL diferentes (5.0.27, 5.0.96, 5.1.algo, 5.5.27, 5.6.2) en Windows y Linux (no las mismas versiones en ambos sistemas operativos, sin embargo). MyISAM solo ganó cuando la mesa estaba vacía. InnoDB fue más rápido cuando los datos ya estaban presentes y, en general, funciona mejor (excepto en el espacio de disco duro: MyISAM es más pequeño en el disco).
Aún así, para beneficiarse realmente de ello, tiene que probarlo usted mismo - con diferentes versiones, configuraciones diferentes y mucha paciencia - especialmente con respecto a incoherencias extrañas (5.0.97 fue mucho más rápido que 5.5.27 con el misma configuración - todavía estamos buscando la causa). Lo que encontramos fue que DISABLE KEYS
y ENABLE KEYS
son inútiles ya veces dañinos si no comienza con una tabla vacía.
¿Está seguro de que la actualización de la clave es un cuello de botella? – abcde123483
Esa es mi preocupación y hay alguien que tiene la misma preocupación aquí http://forums.mysql.com/read.php?21,68820,68939#msg-68939 – Mellon
De todos modos, esos índices se crearán una vez que los habilite nuevamente . Intente hacer una inserción bul en lugar de una fila/fila y también hacer una actualización de estadísticas y ver si eso mejora algo. – Rahul