2010-07-09 11 views
5

Tout d'abord, je suis novice dans l'optimisation de mysql. Le fait est que j'ai dans mon application web (environ 400 requêtes par seconde), une requête qui utilise un GROUP BY que je ne peux pas éviter et qui est la cause de la création de tables temporaires. Ma configuration était la suivante:Configuration de tables temporaires (tables de mémoire) MySQL optimales?

max_heap_table_size = 16M 
tmp_table_size = 32M 

Le résultat: table temporaire sur le disque pour cent + - 12,5%

Puis j'ai changé mes paramètres, selon this post

max_heap_table_size = 128M 
tmp_table_size = 128M 

Le résultat: table temporaire sur le disque Pourcentage + - 18%

Les résultats n'étaient pas attendus, ne comprennent pas pourquoi. Il est faux tmp_table_size = max_heap_table_size? Ne devrait pas augmenter la taille?

Recherche

SELECT images, id 
FROM classifieds_ads 
WHERE parent_category = '1' AND published='1' AND outdated='0' 
GROUP BY aux_order 
ORDER BY date_lastmodified DESC 
LIMIT 0, 100; 

EXPLIQUEZ

| 1 |SIMPLE|classifieds_ads | ref |parent_category, published, combined_parent_oudated_published, oudated | combined_parent_oudated_published | 7 | const,const,const | 67552 | Using where; Using temporary; Using filesort | 
+1

Pas besoin de présenter des excuses - votre anglais est assez bon. –

+0

D'accord avec OMG Ponies; nous espérons que personne ne sera dissuadé de poser des questions au cas où leur anglais ne serait pas brillant. –

+0

Votre anglais écrit est mieux que certains des collègues natifs anglais que j'ai le malheur de travailler avec! :) –

Répondre

9

"Utilisation temporaire" dans le rapport EXPLIQUER ne nous dit pas que la table temporaire était sur le disque. Il nous indique seulement que la requête s'attend à créer une table temporaire.

La table temporaire restera en mémoire si sa taille est inférieure à tmp_table_size et moins de max_heap_table_size. Max_heap_table_size est la plus grande table qu'une table peut contenir dans le moteur de stockage MEMORY, que cette table soit une table temporaire ou une table non temporaire. Tmp_table_size est la taille maximale qu'une table peut avoir en mémoire lorsqu'elle est créée automatiquement par une requête. Mais cela ne peut pas être plus grand que max_heap_table_size. Il n'y a donc aucun avantage à définir tmp_table_size supérieur à max_heap_table_size. Il est courant de définir ces deux variables de configuration à la même valeur.

Vous pouvez surveiller le nombre de tables temporaires ont été créés, et combien sur le disque comme celui-ci:

mysql> show global status like 'Created%'; 
+-------------------------+-------+ 
| Variable_name   | Value | 
+-------------------------+-------+ 
| Created_tmp_disk_tables | 20 | 
| Created_tmp_files  | 6  | 
| Created_tmp_tables  | 43 | 
+-------------------------+-------+ 

Note dans cet exemple, 43 tables temporaires ont été créés, mais seulement 20 d'entre eux étaient sur le disque. Lorsque vous augmentez les limites de tmp_table_size et de max_heap_table_size, vous autorisez l'existence de tables temporaires plus importantes en mémoire.

Vous pouvez demander, quelle taille avez-vous besoin pour le faire? Vous n'avez pas nécessairement besoin de le rendre assez grand pour que chaque table temporaire puisse entrer dans la mémoire. Vous voudrez peut-être que 95% de vos tables temporaires tiennent dans la mémoire et que seules les tables rares restantes soient stockées sur le disque. Ces derniers 5% peuvent être très volumineux - beaucoup plus gros que la quantité de mémoire que vous voulez utiliser pour cela.

Donc, ma pratique est d'augmenter prudemment tmp_table_size et max_heap_table_size. Puis regardez le ratio de Created_tmp_disk_tables à Created_tmp_tables pour voir si j'ai atteint mon objectif de faire en sorte que 95% d'entre eux restent en mémoire (ou quel que soit le ratio que je veux voir).

Malheureusement, MySQL ne dispose pas d'une bonne façon de vous dire exactement comment les grandes tables temporaires étaient. Cela varie par requête, de sorte que les variables d'état ne peuvent pas montrer, ils ne peuvent vous montrer un compte de combien de fois il a eu lieu. Et EXPLAIN n'exécute pas réellement la requête de sorte qu'il ne peut pas prédire exactement combien de données il va correspondre.

Une alternative est Percona Server, qui est une distribution de MySQL avec des améliorations. L'un d'entre eux est log extra information in the slow-query log. Inclus dans les champs supplémentaires est la taille de toutes les tables temporaires créées par une requête donnée.

Questions connexes