2010-08-07 9 views
10

Tengo una aplicación de comercio electrónico que usa MySQL, y me gustaría que fuera más rápido. Cuando se accede a una parte # en el sitio web al que se ha accedido antes, la pieza se carga rápidamente porque todos los datos necesarios ya están en el grupo de búferes INNODB. Sin embargo, si la parte # nunca se ha cargado antes, esos datos aún no están en la agrupación de almacenamiento intermedio, por lo que es necesario leerlos desde el disco, y eso es lento. Configuré el grupo de búferes de INNODB en 2 GB, y esta base de datos completa solo tiene unos 350 MB, por lo que hay mucho espacio para cargar toda la base de datos en el grupo de búferes. Puedo ver en las estadísticas de INNODB que solo se usa aproximadamente la mitad del grupo de búferes en este momento.¿Cómo precargar tablas en el grupo de búferes INNODB con MySQL?

He encontrado referencias para precargar los datos, también conocido como "calentar" el grupo de búferes, como Quickly preloading Innodb tables in the buffer pool o mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole .html. La estrategia básicamente implica forzar un escaneo de tabla en cada tabla, ya que MySQL no tiene una forma nativa de precargar los datos.

No quiero crear manualmente una secuencia de comandos que enumera todas las tablas en mi base de datos y tengo que hacer esto. ¿Cómo puedo crear una secuencia de comandos que atraviesa y hacer una selección para cada tabla de forma automática, y selecciona automáticamente una columna no indexada para que se realice una exploración de tabla?

Respuesta

0

Esta consulta devolverá los nombres de tabla en su base de datos, por lo que no tiene que introducir manualmente:

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name' 

Luego, para cada nombre de la tabla mesa fuerza de exploración.

22

Esto debe darle una lista de consultas para ejecutar;)

SELECT 
    CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL') 
FROM 
    information_schema.COLUMNS AS c 
LEFT JOIN (
    SELECT DISTINCT 
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME 
    FROM 
    information_schema.KEY_COLUMN_USAGE 
) AS k 
USING 
    (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) 
WHERE 
    c.TABLE_SCHEMA = 'yourDatabase' 
    AND k.COLUMN_NAME IS NULL 
GROUP BY 
    c.TABLE_NAME 

Usted puede ponerlo en procedimiento almacenado, y repasar el conjunto de resultados con el cursor. Crea una declaración preparada de cada fila y ejecuta.

+3

este algoritmo es simplemente conciso y brillante. Esto almacenará en caché los datos innodb. No estoy seguro de si este caché incluirá todas las páginas de índice, pero su algoritmo se puede aplicar rápidamente para hacerlo. Creo que MyISAM solo almacena en caché páginas de índice MYI. Nuevamente, su algoritmo forma la base para pasar tablas e índices. Bravo (y +1) !!!! – RolandoMySQLDBA

+1

El mío es la única implementación para obtener una lista de consultas. La idea proviene del Blog de rendimiento de Mysql vinculado en la Pregunta. – Mchl

Cuestiones relacionadas