Conversión de tabla grande de MyISAM a Innodb

9

Tengo una tabla con aproximadamente 300 millones de filas en formato MyISAM que quiero convertir a Innodb

Mi objetivo original era reducir el uso cambiando el esquema de la tabla para tener índices más simples. Tiré toda la mesa, la dejé caer, la recreé con menos índices, y ahora estoy volviendo a importar. Sin embargo, olvidé especificar que debería ser innodb en lugar de myisam.

¿Puedo hacer el estándar ALTER TABLE ... ENGINE = INNODB? ¿Hay algo especial que debería tener en cuenta con una mesa tan enorme?

La operación de importación de datos está demorando alrededor de 12 horas; detesto hacerlo nuevamente. De ahí por qué solo quiero convertirlo.

Will Glass
fuente
¡Con 300 millones de filas, MyISAM es probablemente más rápido y mejor para una mesa de ese tamaño de todos modos!
Mark Henderson

Respuestas:

14

El siguiente ejercicio salió del libro " High Performance MySQL, Second Edition ".

Este es un libro excelente y se lo recomendaría a cualquiera.

La respuesta corta es:

Con el tamaño y las condiciones de su mesa, sin importar el método que elija, creo que potencialmente tendrá una larga espera.


Conversiones de tabla

Hay varias formas de convertir una tabla de un motor de almacenamiento a otro, cada una con ventajas y desventajas.

ALTERAR TABLA

mysql> ALTER TABLE mytable ENGINE = Falcon;

Esta sintaxis funciona para todos los motores de almacenamiento, pero hay un inconveniente: puede llevar mucho tiempo. MySQL realizará una copia fila por fila de su tabla anterior en una tabla nueva. Durante ese tiempo, probablemente usará toda la capacidad de E / S de disco del servidor, y la tabla original se bloqueará de lectura mientras se ejecuta la conversión.

Volcado e importación

Para obtener más control sobre el proceso de conversión, puede optar por volcar primero la tabla en un archivo de texto utilizando la utilidad mysqldump. Una vez que haya volcado la tabla, simplemente puede editar el archivo de volcado para ajustar la instrucción CREATE TABLE que contiene. Asegúrese de cambiar el nombre de la tabla, así como su tipo, porque no puede tener dos tablas con el mismo nombre en la misma base de datos, incluso si son de diferentes tipos, y mysqldump por defecto escribe un comando DROP TABLE antes de CREATE TABLE , por lo que puede perder sus datos si no tiene cuidado.

CREAR y SELECCIONAR

La tercera técnica de conversión es un compromiso entre la velocidad del primer mecanismo y la seguridad del segundo. En lugar de volcar la tabla completa o convertirla de una vez, cree la nueva tabla y use la sintaxis INSERT ... SELECT de MySQL para llenarla, de la siguiente manera:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Eso funciona bien si no tiene muchos datos, pero si los tiene, a menudo es más eficiente llenar la tabla de forma incremental, confirmando la transacción entre cada fragmento para que los registros de deshacer no crezcan mucho. Suponiendo que id es la clave principal, ejecute esta consulta repetidamente (utilizando valores más grandes de x e y cada vez) hasta que haya copiado todos los datos en la nueva tabla:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Después de hacerlo, se quedará con la tabla original, que puede soltar cuando haya terminado, y la nueva tabla, que ahora está completamente poblada. ¡Tenga cuidado de bloquear la tabla original si es necesario para evitar obtener una copia inconsistente de los datos!

KPWINC
fuente
2

La instrucción ALTER TABLE esencialmente hace lo mismo: el servidor crea una tabla temporal donde copia todas las filas y luego hace un RENAME. Los formatos en disco son extremadamente diferentes entre InnoDB y MyISAM, por lo que no espero que encuentres ningún acceso directo a esto.

Otra observación (de la que puede estar al tanto, pero ayudaría a otros a leer esto): el formato en disco para InnoDB depende en gran medida de la clave primaria, porque agrupa los registros basados ​​en ella. Entonces, cuando trabaje con tablas grandes de InnoDB, piense dos veces antes de elegir la clave primaria, porque al cambiarla se reconstruye toda la tabla, como el problema en cuestión.

De todos modos, recomiendo hacer algunas pruebas primero en una mesa de tamaño moderado y cronometrarlas.

rpetre
fuente
2
Cualquier operación de alteración de la tabla en MySQL (y eso incluye agregar índices) reconstruye la tabla.
David Pashley