2011-11-21 21 views
18

En mi base de datos MySQL, hay una tabla que tiene 2,000,000 de registros. Ahora, me gustaría insertar otros 6,000,000 de nuevos registros en esta tabla.MySQL disable & enable keys

Para acelerar la inserción, aunque yo debería usar activar/desactivar las teclas como siguiente:

ALTER TABLE cars DISABLE KEYS; 

INSERT INTO cars ... 
... 
... 
INSERT INTO cars ... 

ALTER TABLE search_all_values ENABLE KEYS; 

OPTIMIZE TABLE cars; 

pero de alguna manera sienten que, al activar/desactivar las teclas tendría más sentido que se utilizará para mesa vacía inserción.

Mientras que en mi caso, ya tengo 2.000.000 registros en la tabla, cuando ENABLE KEYS, mysql volverá a crear todos los índices (incluidos los registros existentes y los nuevos registros agregados) que probablemente no producirán una inserción de datos eficiente como un todo en mi caso. Como volver a crear todos los índices se llevará mucho tiempo y probablemente también lo hace OPTIMIZE TABLE

me gustaría preguntarle su opinión acerca tengo razón y cómo puedo tener una inserción de datos eficiente en mi caso?

+0

¿Está seguro de que la actualización de la clave es un cuello de botella? – abcde123483

+1

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

+0

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

Respuesta

1

La indexación de las nuevas claves llevará algo de tiempo. Depende de usted decidir si desea que se haga de una vez (deshabilitándolo primero) o de uno en uno (manteniéndolo tal como está y dejando que indexe cuando se agregue cada registro)

I ' d ir por el último, no deshabilitar las llaves. Si teme estresar demasiado al servidor, puede intentar insertarlo en lotes, p. solo una cierta cantidad de insertos por minuto.

+0

@ mlitn, ¿qué hay de optimizar la tabla después de la inserción de datos, es este paso necesario? – Mellon

39

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.

+1

Esta es una respuesta realmente fantástica. ¡Gracias por tu minuciosa investigación! – pinkgothic

+0

Hmm, buen esfuerzo, pero dudaría de la conclusión, ya que la gran variación en los resultados de las pruebas no sería indicativa de que hay ** muchos factores desconocidos aquí? – Pacerier