sql >> Base de Datos >  >> RDS >> Mysql

Rendimiento de MySQL:MyISAM frente a InnoDB

Un factor importante en el rendimiento de la base de datos es el motor de almacenamiento utilizado por la base de datos y, más específicamente, sus tablas. Los distintos motores de almacenamiento proporcionan un mejor rendimiento en una situación que en otra. Para uso general, hay dos contendientes a considerar. Estos son MyISAM, que es el motor de almacenamiento predeterminado de MySQL, o InnoDB, que es un motor alternativo integrado a MySQL destinado a bases de datos de alto rendimiento. Antes de que podamos comprender la diferencia entre los dos motores de almacenamiento, debemos comprender el término "bloqueo".

¿Qué es el bloqueo en MySQL?

Para proteger la integridad de los datos almacenados en las bases de datos, MySQL emplea el bloqueo. Bloquear, en pocas palabras, significa proteger los datos para que no se acceda a ellos. Cuando se aplica un bloqueo, los datos no se pueden modificar excepto por la consulta que inició el bloqueo. El bloqueo es un componente necesario para garantizar la precisión de la información almacenada. Cada motor de almacenamiento tiene un método diferente de bloqueo utilizado. Dependiendo de sus datos y prácticas de consulta, un motor puede superar a otro. En esta serie, veremos los dos tipos más comunes de bloqueo empleados por nuestros dos motores de almacenamiento.

Bloqueo de tablas: La técnica de bloquear una tabla completa cuando una o más celdas dentro de la tabla necesitan actualizarse o eliminarse. El bloqueo de tablas es el método predeterminado empleado por el motor de almacenamiento predeterminado, MyISAM.

Ejemplo:bloqueo de tabla MyISAM Columna A Columna B Columna C
Consulta 1 ACTUALIZAR Fila 1 Escribir datos datos
Consulta 2 SELECCIONAR (Esperar) Fila 2 datos datos datos
Consulta 3 ACTUALIZAR (Esperar) Fila 3 datos datos datos
Consulta 4 SELECCIONAR (Esperar) Fila 4 datos datos datos
Consulta 5 SELECCIONAR (Esperar) Fila 5 datos datos datos
El ejemplo ilustra cómo una única operación de escritura bloquea toda la tabla, lo que provoca que otras consultas esperen a que finalice la consulta de ACTUALIZACIÓN.

Bloqueo a nivel de fila: El acto de bloquear un rango efectivo de filas en una tabla mientras se modifican o eliminan una o más celdas dentro del rango. El bloqueo a nivel de fila es el método utilizado por el motor de almacenamiento InnoDB y está diseñado para bases de datos de alto rendimiento.

Ejemplo:bloqueo de nivel de fila de InnoDB Columna A Columna A Columna A
Consulta 1 ACTUALIZAR Fila 1 Escribir datos datos
Consulta 2 SELECCIONAR Fila 2 Lectura datos datos
Consulta 3 ACTUALIZAR Fila 3 datos Escribir datos
Consulta 4 SELECCIONAR Fila 4 Lectura Lectura Lectura
Consulta 5 SELECCIONAR Fila 5 Lectura datos Lectura
El ejemplo muestra cómo el uso del bloqueo a nivel de fila permite ejecutar varias consultas en filas individuales al bloquear solo las filas que se actualizan en lugar de toda la tabla.

MyISAM frente a InnoDB

Al comparar los dos motores de almacenamiento, llegamos al quid de la discusión entre el uso de InnoDB sobre MyISAM. Una aplicación o sitio web que tiene una tabla de uso frecuente funciona excepcionalmente bien con el motor de almacenamiento InnoDB al resolver los cuellos de botella de bloqueo de tablas. Sin embargo, la cuestión de usar uno sobre el otro es subjetivo ya que ninguno de ellos es perfecto en todas las situaciones. Hay puntos fuertes y limitaciones en ambos motores de almacenamiento. El conocimiento íntimo de la estructura de la base de datos y las prácticas de consulta es fundamental para seleccionar el mejor motor de almacenamiento para sus tablas.

MyISAM superará a InnoDB en tablas grandes que requieren mucha más actividad de lectura que actividad de escritura. Las legibilidades de MyISAM eclipsan a InnoDB porque bloquear toda la tabla es más rápido que averiguar qué filas están bloqueadas en la tabla. Cuanta más información haya en la tabla, más tiempo le llevará a InnoDB descubrir cuáles no son accesibles. Si su aplicación se basa en tablas enormes que no cambian los datos con frecuencia, MyISAM superará a InnoDB. Por el contrario, InnoDB supera a MyISAM cuando los datos dentro de la tabla cambian con frecuencia. Los cambios de tabla escriben datos más que leyendo datos por segundo. En estas situaciones, InnoDB puede mantenerse al día con grandes cantidades de solicitudes más fácilmente que bloquear la tabla completa para cada una.

¿Debo usar InnoDB con sitios de WordPress, Magento o Joomla?

La respuesta corta aquí es sí, en la mayoría de los casos. Los equipos de soporte de alojamiento web más útiles de Liquid Web se han encontrado con varios cuellos de botella de bloqueo de tablas cuando los clientes utilizan algunas aplicaciones web estándar de hoy. La mayoría de los usuarios de aplicaciones populares de terceros como WordPress, Magento y Joomla tienen un conocimiento limitado de los componentes de la base de datos subyacente o del código involucrado para tomar una decisión informada sobre los motores de almacenamiento. La mayoría de los cuellos de botella de bloqueo de tablas de estos sistemas de administración de contenido (CMS) generalmente se resuelven cambiando todas las tablas del sitio a InnoDB en lugar del MyISAM predeterminado. Si aloja muchos de estos tipos de CMS en su servidor, sería beneficioso cambiar el motor de almacenamiento predeterminado en MySQL para usar InnoDB para todas las tablas nuevas, de modo que cualquier instalación de tabla nueva comience con InnoDB.

Configuración del motor de almacenamiento predeterminado

Configure su motor de almacenamiento predeterminado en InnoDB agregando default_storage_engine=InnoDB al [mysqld] sección del archivo de configuración del sistema ubicado en: /etc/my.cnf. Es necesario reiniciar el servicio MySQL para que el servidor detecte cambios en el archivo.

~ $ cat /etc/my.cnf
[mysqld]
log-error=/var/lib/mysql/mysql.err
innodb_file_per_table=1
default-storage-engine=innodb
innodb_buffer_pool_size=128M

Conversión de todas las tablas entre MyISAM e InnoDB

Desafortunadamente, MySQL no tiene inherentemente una opción para convertir tablas, dejando que cada tabla se cambie individualmente. El equipo de soporte de Liquid Web ha elaborado un plan de mantenimiento fácil de seguir para este proceso. El script, que puede ejecutar en el servidor necesario a través del acceso de shell (SSH), convertirá todas las tablas entre los motores de almacenamiento.

NotaPlanifique en consecuencia cuando realice operaciones por lotes de esta naturaleza en caso de que se produzca un tiempo de inactividad. La mejor práctica es hacer una copia de seguridad de todas sus bases de datos MySQL antes de implementar un cambio de esta magnitud; hacerlo proporciona un punto de recuperación fácil para evitar la pérdida de datos.

Paso 1:  Preparación

Planifique comenzar a una hora del día en la que el tiempo de inactividad tenga consecuencias mínimas. Este proceso en sí no requiere ningún tiempo de inactividad, sin embargo, el tiempo de inactividad puede ser necesario para recuperarse de circunstancias imprevistas.

Paso 2:  Copia de seguridad de todas las bases de datos en un archivo

El siguiente comando crea una copia de seguridad de un solo archivo de todas las bases de datos denominadas all-databases-backup.sqld y se puede eliminar una vez que la conversión se haya realizado correctamente y no haya problemas aparentes.
mysqldump --all-databases > all-databases-backup.sql

Paso 3:  Registrar motores de tablas existentes en un archivo

Ejecute el siguiente script para registrar los motores de tablas existentes en un archivo llamado table-engine-backup.sql . Luego puede "importar" o "ejecutar" este archivo más tarde para volver a convertirlo a sus motores originales si es necesario.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=",Engine,";") FROM information_schema.tables WHERE table_schema NOT IN("mysql","information_schema","performance_schema");' | tee table-engine-backup.sql

Si necesita revertir los motores de tabla por algún motivo, ejecute:
mysql < table-engine-backup.sql

Paso 4a:  Convertir tablas MyISAM a InnoDB

El siguiente comando continuará incluso si una tabla falla y le permite saber qué tablas no se convirtieron. La salida se guarda en el archivo llamado convert-to-innodb.log para revisión posteriorw.
mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=InnoDB;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "MyISAM";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-innodb.log

Paso 4b:Convierta todas las tablas de InnoDB a MyISAM

Este comando continuará incluso si una tabla falla y le permite saber qué tablas no se convirtieron. La salida también se guarda en el archivo llamado convert-to-myisam.log para revisión posterior.

mysql -Bse 'SELECT CONCAT("ALTER TABLE ",table_schema,".",table_name," ENGINE=MyISAM;") FROM information_schema.tables WHERE table_schema NOT IN ("mysql","information_schema","performance_schema") AND Engine = "InnoDB";' | while read -r i; do echo $i; mysql -e "$i"; done | tee convert-to-myisam.log

Conversión de una sola tabla entre MyISAM e InnoDB

Los siguientes comandos ilustran cómo se logra convertir una sola tabla.

NotaReemplace nombre_base_datos con el nombre de base de datos adecuado y nombre_tabla con el nombre de tabla correcto. Asegúrese de tener una copia de seguridad válida de la tabla en cuestión antes de continuar.

Copia de seguridad de una sola tabla en un archivo
mysqldump database_name table_name > backup-table_name.sql

Convertir una sola tabla a InnoDB

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=InnoDB;’

Convertir una sola tabla a MyISAM:

mysql -Bse ‘ALTER TABLE database_name.table_name ENGINE=MyISAM;’

Consulte nuestros otros artículos de esta serie, Rendimiento de MySQL:identificación de consultas largas, para identificar consultas lentas dentro de su base de datos. Estén atentos a nuestro próximo artículo donde cubriremos el almacenamiento en caché y la optimización.

Navegación en serie<>