2010-08-07 21 views
10

J'ai une application de commerce électronique qui utilise MySQL, et j'aimerais qu'elle soit plus rapide. Lorsque vous accédez à un numéro de pièce sur le site Web auquel vous avez accédé auparavant, la pièce se charge rapidement car toutes les données nécessaires se trouvent déjà dans le pool de mémoire tampon INNODB. Cependant, si la partie # n'a jamais été chargée auparavant, ces données ne sont pas encore dans le pool de mémoire tampon, elles doivent donc être lues sur le disque, ce qui est lent. J'ai mis mon pool de mémoire tampon INNODB à 2 Go, et cette base de données entière est seulement environ 350 Mo, donc il y a beaucoup d'espace pour charger la base de données entière dans le pool de mémoire tampon. Je peux voir à partir des statistiques INNODB que seulement environ la moitié du pool de mémoire tampon est utilisé en ce moment.Comment précharger des tables dans le pool de mémoire tampon INNODB avec MySQL?

J'ai trouvé des références à une pré-chargement des données, aussi connu comme « l'échauffement » le pool de mémoire tampon, comme Quickly preloading Innodb tables in the buffer pool ou mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole .html. La stratégie consiste essentiellement à forcer un scan de table sur chaque table puisque MySQL n'a pas de moyen natif pour le préchargement des données.

Je ne veux pas créer manuellement un script qui répertorie toutes les tables de ma base de données et doit le faire. Comment puis-je créer un script qui passe et sélectionne automatiquement chaque table, et sélectionne automatiquement une colonne non indexée pour effectuer une analyse de table?

Répondre

0

Cette requête renverra les noms de table dans votre base de données, de sorte que vous ne devez pas les entrer manuellement:

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

Ensuite, pour chaque nom de table de balayage de table de force.

22

Cela devrait vous donner une liste de requêtes à exécuter;)

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 

Vous pouvez le mettre dans la procédure stockée, et aller au-dessus avec le curseur ResultSet. Créez une instruction préparée à partir de chaque ligne et exécutez-la.

+3

cet algorithme est simplement concis et brillant. Cela mettra en cache les données innodb. Je ne suis pas sûr si cela mettra en cache toutes les pages d'index innodb, mais votre algorithme peut être appliqué rapidement pour le faire. Je crois que MyISAM ne met en cache que les pages d'index MYI. Encore une fois, votre algorithme constitue la base pour passer à travers les tables et les index. Bravo (et +1) !!!! – RolandoMySQLDBA

+1

Mine est seulement l'implémentation pour obtenir une liste de requêtes. L'idée vient de Mysql Performance Blog lié à la question. – Mchl