Hemos discutido cómo configurar InnoDB para un alto rendimiento hace un tiempo, sin embargo, aún no hemos discutido cómo podemos mejorar el rendimiento de MySQL mientras usamos la configuración avanzada de InnoDB. Esta entrada de blog debería proporcionar un poco más de información sobre este tema.
Explicación de InnoDB
Antes de profundizar en la configuración de InnoDB, probablemente deberíamos comprender los conceptos básicos:InnoDB es un motor de almacenamiento para MySQL, MariaDB y Percona Server. El motor se conocía como complemento InnoDB, que requiere la configuración e instalación del complemento. Hasta el lanzamiento de MySQL 5.5.5, InnoDB ya no es un complemento y ahora forma parte del paquete MySQL como uno de los motores de almacenamiento admitidos para MySQL. Desde el lanzamiento de MySQL 5.6, InnoDB se ha convertido en el motor de almacenamiento predeterminado:es un motor de almacenamiento de propósito general que equilibra alta confiabilidad y alto rendimiento. Las ventajas clave de InnoDB incluyen la compatibilidad con el bloqueo a nivel de fila, las claves externas y el seguimiento del modelo ACID (Durabilidad del aislamiento de la consistencia de la atomicidad):ACID es un conjunto de propiedades que están destinadas a garantizar la validez de los datos a pesar de los errores, fallas de energía y otros problemas. InnoDB tiene una extensa lista de variables y algunas de ellas ayudan a mejorar el rendimiento, especialmente en el tipo de hardware y los recursos disponibles de su servidor de base de datos. Entre estos se encuentran:
- innodb_data_file_path es el archivo donde se almacenan los datos de las tablas de InnoDB.
- innodb_buffer_pool_size es un búfer de memoria que InnoDB utiliza para almacenar en caché datos e índices de sus tablas.
- innodb_log_file_size representa el tamaño de los archivos de registro de InnoDB. Cuanto mayor sea innodb_log_file_size, mayor será el tiempo de recuperación que necesita en caso de un bloqueo.
- InnoDB usa innodb_log_buffer_size para escribir en los archivos de registro en el disco.
- innodb_flush_log_at_trx_commit controla el equilibrio entre el rendimiento y el cumplimiento de ACID. El valor predeterminado es 1, lo que ayuda a mantener el cumplimiento de InnoDB ACID:al cambiar innodb_flush_log_at_trx_commit a 2 se obtiene una velocidad de escritura muy rápida, pero se pueden perder hasta un segundo de transacciones.
También hay configuraciones avanzadas de InnoDB que se pueden configurar para mejorar aún más el rendimiento de MySQL. Vamos a echarles un vistazo ahora.
Configuración avanzada de InnoDB
Como ya se indicó anteriormente, InnoDB tiene configuraciones avanzadas que se pueden usar para mejorar aún más su rendimiento (no las enumeraremos absolutamente todas, pero las configuraciones que se enumeran deberían darle una buena idea). idea de cuán poderoso es realmente InnoDB):
- InnoDB se puede deshabilitar; si desea deshabilitar InnoDB, simplemente modifique el archivo my.cnf y agregue skip-innodb en la sección [mysqld]. Después de eso, reinicie su servidor MySQL; InnoDB ahora debería estar deshabilitado. Alternativamente, puede hacer uso de la opción --innodb:configurarlo en APAGADO desactiva el motor. Aunque tenga en cuenta que estas opciones están obsoletas a partir de MySQL 5.7.5.
- InnoDB también proporciona un mecanismo de bloqueo configurable que puede mejorar el rendimiento de las instrucciones SQL que agregan filas a las tablas con columnas AUTO_INCREMENT:los modos de incremento automático se pueden configurar al inicio mediante la opción innodb_autoinc_lock_mode. La opción tiene tres configuraciones para especificar el modo de bloqueo:el modo de bloqueo puede ser 0 ("tradicional"), 1 ("consecutivo") o 2 ("intercalado"). Los valores ofrecen rendimiento según el tipo de inserción de la base de datos. En resumen, 0 ofrece compatibilidad con versiones anteriores de MySQL e Innodb. El valor de 1 ofrece un enfoque más seguro y determinista para la replicación basada en declaraciones (SBR). Mientras que el valor de 2 tiene el modo de bloqueo más escalable y rápido, las filas insertadas por cualquier declaración dada pueden no ser consecutivas. Consulte la documentación de MySQL para obtener más información.
- InnoDB le brinda la capacidad de dividir el grupo de búfer en múltiples segmentos (la función solo está disponible desde MySQL 5.5):la configuración innodb_buffer_pool_instances le permite mejorar la escalabilidad de MySQL en máquinas que ejecutan múltiples núcleos. De forma predeterminada, el valor de esta configuración es 1 si innodb_buffer_pool_size es inferior a 1 GB y 8 en caso contrario:el número especifica el número de regiones en las que se divide el grupo de búfer de InnoDB. Esta configuración se puede usar para involucrar más núcleos, explicaremos cómo más adelante.
- InnoDB ofrece cuatro niveles de aislamiento de transacciones (tx_isolation en <5.7 pero transaction_isolation en la versión 5.7 en adelante):READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ y SERIALIZABLE:estos niveles de aislamiento son la "I" en el acrónimo ACID :
- Cuando READ UNCOMMITTED está en uso, una transacción puede ver cambios no confirmados por otra transacción. Este nivel de aislamiento permite lecturas sucias.
- Cuando READ COMMITTED está en uso, puede estar seguro de que todos los datos que se leyeron se confirmaron en el momento en que se leyeron.
- Cuando se usa LECTURA REPETIBLE, se usa un nivel de aislamiento más alto. Además de todo lo que garantiza el nivel LECTURA COMPROMETIDA, también garantiza que los datos que ya se leyeron no pueden cambiar.
- Cuando se usa SERIALIZABLE, se usa un nivel de aislamiento aún mayor. Además de todo lo que garantiza el nivel de aislamiento de LECTURA REPETIBLE, también garantiza que no se puedan ver datos nuevos en lecturas posteriores.
- InnoDB también le permite definir la capacidad de E/S general disponible para InnoDB modificando la variable innodb_io_capacity. El valor de esta variable debe establecerse en aproximadamente la cantidad de IOPS que el sistema puede realizar por segundo:al establecer el valor de este parámetro, tenga en cuenta que los valores alrededor de 100 son más apropiados para HDD, mientras que los SSD pueden beneficiarse de valores más altos. . La variable innodb_io_capacity_max también puede ser de ayuda:esta variable permite que InnoDB se descargue de forma más agresiva, lo que significa que la tasa de operaciones de E/S podría exceder el límite definido por innodb_io_capacity; en tales situaciones, las operaciones no excederán el valor definido por la variable innodb_io_capacity_max .
- InnoDB también le permite controlar cuántos subprocesos en segundo plano están disponibles para las operaciones de E/S:la cantidad de subprocesos de E/S asignados a las operaciones de lectura se puede controlar mediante la variable innodb_read_io_threads mientras que la cantidad de subprocesos de E/S Los subprocesos O asignados a las operaciones de escritura pueden controlarse mediante la variable innodb_write_io_threads. El valor predeterminado para ambos parámetros es 4 y el valor máximo permitido es 64.
- InnoDB tiene la capacidad de convertir ciertas advertencias de InnoDB en errores:para hacerlo, simplemente establezca la variable innodb_strict_mode en ON:esta variable afecta el manejo de errores de sintaxis para las operaciones CREATE TABLE, ALTER TABLE y CREATE INDEX :deshabilitar esta variable podría resolver los errores de "Tamaño de fila demasiado grande". Para deshabilitar el modo estricto, establezca innodb_strict_mode en APAGADO.
- InnoDB se puede proteger de alguna manera contra exploraciones de tablas completas que interfieren con los datos almacenados en caché en el grupo de búfer aumentando la variable innodb_old_blocks_time. El valor mínimo para esta configuración es 0, el valor predeterminado es 1000.
- Si ejecuta operaciones de mantenimiento en tablas InnoDB que contienen índices FULLTEXT, considere activar la variable innodb_optimize_fulltext_only; después de habilitar esta variable, la consulta OPTIMIZE TABLE debería ejecutarse más rápido porque omitirá la reorganización de los datos en la mesa. Tenga en cuenta que esta configuración solo está pensada para habilitarse temporalmente, por lo que es posible que desee desactivarla una vez que finalice la optimización.
- Para iniciar InnoDB en modo de solo lectura, habilite la configuración innodb_read_only. Cuando esta configuración está habilitada, puede consultar las tablas de InnoDB donde el directorio de datos de MySQL está en medios de solo lectura.
Hacer que InnoDB atraiga más núcleos
También puede hacer que InnoDB involucre más núcleos aprovechando sus capacidades de subprocesos múltiples:sorprendentemente, esto no es muy difícil de lograr, solo necesita modificar un par de configuraciones. Así es como se hace:
- Deje la opción innodb_thread_concurrency en su valor predeterminado 0. Al hacerlo, permite que InnoDB decida la mejor cantidad de tickets de concurrencia (determinan la cantidad de subprocesos que pueden ingresar simultáneamente a InnoDB) para abrir para un MySQL determinado configuración de la instancia. Para MariaDB a partir de 10.5, está marcado como obsoleto, por lo que tendría sentido que MySQL establezca esto en 0, ya que los recursos informáticos han sido sofisticados en comparación con los primeros días de MySQL.
- Una vez que la opción innodb_thread_concurrency se establece en 0, establezca tanto innodb_read_io_threads como innodb_write_io_threads en sus valores máximos de 64. Esto debería involucrar más núcleos.
Resumen
En resumen, InnoDB es un motor de almacenamiento extremadamente poderoso. El rendimiento de este motor de almacenamiento se ve afectado directamente por la configuración que utiliza este motor. Entonces, si desea mejorar el rendimiento de su instancia de MySQL, asegúrese de tener en cuenta al menos algunos de los consejos mencionados en este artículo. Ajustar la configuración con respecto al motor y usarlos cuando sea apropiado, hacerlo debería darle una ventaja.