Optimización de la configuración predeterminada de InnoDB

8

Miré en my.ini y vi varias configuraciones predeterminadas. Mi base de datos se ejecuta en una sola PC independiente. Quiero optimizar el rendimiento de InnoDB y MySQL en general para el rendimiento. No hay restricción de espacio en disco. ¿Qué configuración predeterminada debo cambiar para optimizar para un mejor rendimiento, confiabilidad y posibles copias de seguridad en un punto en el tiempo [alta disponibilidad].

Editado

En la actualidad, cada vez que ejecuto "Optimizar tablas" a través de Mantenimiento en MySQL Administrator, muestra:

La tabla no admite la optimización, sino que recrea y analiza

en todas las mesas. Todas mis tablas son InnoDB, pero ¿por qué no son compatibles con Optimize?

RPK
fuente
esa edición garantiza una pregunta por separado, imo. Eche un vistazo a la documentación de OPTIMIZE TABLE: dev.mysql.com/doc/refman/5.5/en/optimize-table.html InnoDB admite el comando, pero el proceso es diferente de MyISAM
Derek Downey

Respuestas:

11

La forma de sintonizar InnoDB se centra en

  • InnoDB Buffer Pool: almacena en caché las páginas de datos y las páginas de índice. La cantidad de datos e índice que puede almacenar en caché no es una función de las limitaciones de espacio en disco, sino una función de memoria disponible y espacio en disco utilizado actualmente por InnoDB.
  • InnoDB MetaData: por defecto, el archivo ibdata1 normalmente alberga cualquier cosa y todo InnoDB. Eso incluiría páginas de datos, páginas de índice, metadatos de tabla, datos MVCC .

Aquí hay una fórmula que he usado durante los últimos 5 años para calcular el InnoDB Buffer Pool basado en el espacio en disco utilizado por los datos de InnoDB y las páginas de índice :

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
  • Usar (SELECCIONAR 0 Power1024) para bytes
  • Usar (SELECCIONAR 1 Power1024) para KB
  • Usar (SELECT 2 Power1024) para MB
  • Usar (SELECT 3 Power1024) para GB
  • Use (SELECT 4 Power1024) para TB (envíeme un correo electrónico si tiene TerraBytes de RAM)

Por supuesto, dije una función de memoria disponible y espacio en disco utilizado actualmente por InnoDB. A partir de aquí, solo use el sentido común. ¡El número recomendado de la consulta anterior NO DEBE SUPERAR EL 75% DE LA RAM INSTALADA! Esa es la regla general más simple para dimensionar el InnoDB Buffer Pool.

También debe establecer innodb_flush_method en O_DIRECT ya que proporcionará escrituras síncronas estables de InnoDB. También he escrito una publicación sobre cómo optimizar el almacenamiento en disco para InnoDB .

Con respecto al mensaje, la tabla no admite la optimización, al recrear + analizar en su lugar , la razón por la que recibe ese mensaje de error es el hecho de que el motor de almacenamiento es InnoDB. Mecánicamente, OPTIMIZE TABLE simplemente copia la tabla a una tabla temporal y realiza ANALYZE TABLE .

En realidad, ANALYZE TABLE contra InnoDB es completamente inútil. Incluso si ejecutó ANALYZE TABLE en una tabla de InnoDB, el motor de almacenamiento de InnoDB realiza inmersiones en el índice para aproximaciones de cardinalidad una y otra vez, lo que destruye las estadísticas que acaba de compilar. De hecho, Percona realizó algunas pruebas en la TABLA DE ANÁLISIS y llegó a la misma conclusión también .

Aquí hay otras publicaciones que hice durante el año sobre InnoDB Tuning

RolandoMySQLDBA
fuente
Mi PC tiene 2 GB de RAM e InnoDB_Buffer_Pool_Size está configurado de forma predeterminada en 6M. Lo he aumentado a 500M. ¿Alguna sugerencia?
RPK
Configúrelo 1536M, que es 1.5G, ya que es el 75% de la RAM instalada
RolandoMySQLDBA
Ejecuté su consulta, y da una salida de 45G. La RAM en mi servidor es 8G. ¿Tendría que aumentar mi RAM? O hay algunas condiciones para la consulta anterior ..
Stewie
@Stewie Si tiene 45G de InnoDB, 60GB de RAM es lo que necesita si tiene el presupuesto. Como solo tiene 8G, el 75% de la RAM instalada (6G) es adecuada.
RolandoMySQLDBA
@RolandoMySQLDBA: ¡gran publicación! Pero no entiendo por qué en el caso de Stewie, su RAM es de solo 8 GB, pero el resultado de su consulta puede ser mayor que 8 GB (45G en este caso). ¿Podría aclarar?
Chubaka
3

Aquí hay un artículo más antiguo sobre las variables importantes para la "sintonía gruesa". El más importante probablemente seainnodb_buffer_pool_size

Recomiendo encarecidamente actualizar a MySQL 5.5 (si aún no lo está ejecutando). Hicieron bastantes cambios en el rendimiento de InnoDB. Incluso proporcionan una sección general sobre cómo optimizar para InnoDB ahora que es el motor predeterminado: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

En cuanto a las copias de seguridad en un punto en el tiempo, querrás mirar el registro binario . Lo básico para habilitar esto es establecer la log-binvariable en su my.cnf

Derek Downey
fuente
He actualizado a MySQL 5.5.
RPK
2

Optimizar viene en muchos colores.

Creo que su primer paso debería ser decidir qué significa "optimizar" para usted. Para algunas personas, significa "consultas SELECT más rápidas". Para otros significa "el mejor equilibrio entre el rendimiento SELECCIONAR y el rendimiento INSERTAR". Para otros, "el rendimiento INSERT más rápido".

Debe decidir cuáles son sus criterios y cómo va a saber si sus cambios ayudan antes de comenzar a ajustar.

Luego ponga sus archivos de configuración y opciones de inicio bajo control de versión, y comience a experimentar. Documente el consejo de quién sigue y dónde lo encontró. (El asesoramiento cambia con el tiempo, a medida que cambia la base de código y el hardware). Ponga también esos documentos bajo control de versión.

Mike Sherrill 'Retiro del gato'
fuente