Pregunta

Uno de mis proyectos usa el motor MyISAM en MySQL, pero estoy considerando cambiarlo a InnoDB ya que necesito soporte de transacciones aquí y allá.

  • ¿Qué debo mirar o considerar antes de hacer esto?
  • ¿Puedo cambiar el motor o debo preparar los datos para ello?
¿Fue útil?

Solución

Sí, absolutamente, hay muchas cosas, debe probar su aplicación extremadamente a fondo:

  • Las transacciones pueden interrumpirse y deben repetirse. Este es el caso (en algunas circunstancias) incluso con una transacción confirmada automáticamente que solo inserta una fila.
  • Es casi seguro que el uso del disco aumentará
  • Es casi seguro que la carga de E / S durante las escrituras aumentará
  • El comportamiento de la indexación cambiará porque InnoDB utiliza índices agrupados, lo que puede ser un efecto beneficioso en algunos casos
  • Su estrategia de copia de seguridad se verá afectada. Considera esto cuidadosamente.

El proceso de migración en sí mismo deberá planificarse cuidadosamente, ya que tomará mucho tiempo si tiene muchos datos (durante los cuales los datos serán de solo lectura o no estarán disponibles por completo, verifique)

Otros consejos

Hay una gran advertencia. Si se produce algún tipo de error de hardware (o similar) durante una escritura, InnoDB dañará las tablas.

MyISAM también lo hará, pero mysqlcheck --auto-repair los reparará. Intentar esto con tablas InnoDB fallará. Sí, esto es por experiencia.

Esto significa que necesita tener un buen plan de copia de seguridad de datos regular para usar InnoDB.

Algunas otras notas:

InnoDB no reasigna el espacio libre en el sistema de archivos después de eliminar una tabla / base de datos o eliminar un registro, esto se puede resolver mediante el proceso de volcado e importación " o configurando innodb_file_per_table = 1 en my.cnf.

Agregar / eliminar índices en una tabla grande de InnoDB puede ser bastante doloroso, ya que bloquea la tabla actual, crea una temporal con sus índices alterados e inserta datos fila por fila. Hay un complemento de Innobase , pero funciona solo para MySQL 5.1

InnoDB también es MUCHO MÁS memoria intensiva, le sugiero que tenga una variable tan grande como innodb_buffer_pool_size como lo permita la memoria de su servidor (70-80% debería ser una apuesta segura). Si su servidor es UNIX / Linux, considere reducir la variable de sysctl vm.swappiness a 0 y use innodb_flush_method = O_DIRECT para evitar el doble búfer. Siempre compruebe si pulsa la opción de intercambio al cambiar esos valores. Siempre puede leer más en blog de Percona , que es genial.

También, puede ejecutar mysqlbackup con --single-transaction --skip-lock-tables y no tener bloqueos de tablas mientras se inicia la copia de seguridad.

En cualquier caso, InnoDB es genial, no dejes que algunas trampas te desanimen.

Solo alterar la tabla y configurar el motor debería estar bien.

  • Uno de los más importantes a tener en cuenta es que select count (*) from MyTable es mucho más lento en InnoDB que MyISAM.
  • los valores de auto_increment se restablecerán al valor más alto en la tabla +1 después de reiniciar el servidor; esto puede causar problemas extraños si tiene una base de datos desordenada con algunas eliminaciones.
  • La configuración óptima del servidor será diferente a una base de datos MyISAM principalmente.
  • Asegúrese de que el tamaño del archivo innodb sea lo suficientemente grande como para contener todos sus datos o será crucificado por una reasignación constante cuando cambie los motores de las tablas.

Si tiene la intención de utilizar InnoDB como una forma de obtener consultas concurrentes, entonces querrá establecer innodb_file_trx_commit = 1 para que recupere algo de rendimiento. OTOH, si estaba buscando volver a codificar su aplicación para que sea consciente de las transacciones, entonces decidir esta configuración será parte de la revisión de rendimiento general necesaria de la configuración de InnoDB.

La otra cosa importante a tener en cuenta es que InnoDB no admite índices de texto completo, ni INSERTAR EN RETRASO. Pero entonces, MyISAM no soporta la integridad referencial. :-)

Sin embargo, puede mover solo las tablas que necesita para realizar transacciones. He hecho esto. Las tablas pequeñas (hasta varios miles de filas) a menudo se pueden cambiar sobre la marcha, de forma incidental.

Las características de rendimiento pueden ser diferentes, por lo que es posible que debas vigilar la carga.

Los datos estarán bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top