Importante: No se deben convertir las tablas del sistema en la
base de datos mysql
(por ejemplo,
user
o host
) al tipo
InnoDB
. Las tablas del sistema siempre deben
ser del tipo MyISAM
.
Si se desea que todas las tablas que no sean de sistema se creen
como tablas InnoDB
, simplemente debe
agregarse la línea default-table-type=innodb
a la sección [mysqld]
del fichero
my.cnf
o my.ini
.
InnoDB
no posee una optimización especial
para la creación separada de índices en la misma forma que la
tiene el motor de almacenamiento MyISAM
. Por
lo tanto, no hay beneficio en exportar e importar la tabla y
crear los índices posteriormente. La manera más rápida de
cambiar una tabla al motor InnoDB
es hacer
las inserciones directamente en una tabla
InnoDB
. Es decir, utilizar ALTER
TABLE ... ENGINE=INNODB
, o crear una tabla
InnoDB
vacía con idénticas definiciones e
insertar las filas con INSERT INTO ... SELECT * FROM
...
.
Si se tienen restricciones UNIQUE
sobre
claves secundarias, se puede acelerar la importación de una
tabla desactivando temporalmente la verificación de unicidad
durante la sesión de importación: SET
UNIQUE_CHECKS=0;
. Para tablas grandes, esto ahorra
gran cantidad de operaciones de E/S en disco, debido a que
InnoDB
puede emplear su buffer de inserciones
para grabar registros de índices secundarios en lote.
Para obtener un mejor control sobre el proceso de inserción, podría ser mejor llenar la tablas grandes por partes:
INSERT INTO nuevatabla SELECT * FROM viejatabla WHERE clave > valor1 AND clave <= valor2;
Luego de que todos los registros se hayan insertado, se pueden renombrar las tablas.
Durante la conversión de tablas grandes, se puede reducir la
cantidad de operaciones de E/S en disco incrementando el tamaño
del pool de buffer de InnoDB
. No debe usarse
más del 80% de la memoria física. También pueden aumentarse
los tamaños de los ficheros de registro (log) de
InnoDB
.
Hay que asegurarse de no llenar completamente el espacio de
tablas: las tablas InnoDB
necesitan mucho
más espacio que las tablas MyISAM
. Si una
sentencia ALTER TABLE
se queda sin espacio,
realizará una cancelación (rollback), y esto puede tomar horas
si lo hace sobre el disco. Para las inserciones,
InnoDB
emplea el buffer de inserción para
combinar en lotes los registros secundarios de índices con los
índices. Esto ahorra gran cantidad de operaciones de E/S en
disco. Durante la cancelación no se emplea ese mecanismo, de
modo que puede llevar más de 30 veces el tiempo insumido por la
inserción.
Si se produjera una de estas cancelaciones fuera de control, sino se tienen datos valiosos en la base de datos, puede ser preferible matar el proceso de la base de datos en lugar de esperar que se completen millones de operaciones de E/S en disco. Para el procedimiento completo, consulte Sección 15.8.1, “Forzar una recuperación”.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.