J'ai récemment remarqué que mon serveur MySQL crée un nombre raisonnablement grand de tables de disque [Tableaux de disque Temp créés: 67, Création de tables Temps: 304]. P>
J'essaie d'identifier les requêtes qui créent ces tables, mais je n'ai pas eu de chance. J'ai activé le journal de requête lent pour que les requêtes prennent plus de 1 seconde, mais les requêtes montrant là-bas n'ont pas de sens. Les seules requêtes montrant régulièrement dans le journal des requêtes lentes sont mises à jour d'une seule ligne sur une table utilisateur, à l'aide de la clé primaire comme clause WHERE. P>
J'ai couru "Expliquer" sur toutes les questions qui fonctionnent régulièrement et que je suis vide sur le coupable. P>
3 Réponses :
Les requêtes souvent à l'aide d'un ordre Rechercher des requêtes avec un par code> devront utiliser la ou les table (s) TEMP. Si vous exécutez expliquer code> sur ces requêtes, vous pouvez voir: p>
à l'aide de Filvisort; Utilisation de tables temporaires code> p>
commander par code> p>
Y a-t-il une raison pour laquelle ils utiliseraient des tables de disque? Ma plus grande table est de seulement 600 mégots, mais ma taille de table Temp pour la mémoire est définie pour avoir 4 concerts disponibles. Il est étrange que cela devra jamais utiliser une table de disque temporaire.
Certains types de données forcent une table de disque aussi être utilisée à la place d'une mémoire. Par exemple. Si vous avez un champ code> blob code> ou texte code> dans le champ Sélectionner, la commande de la requête a peut-être forcer des tables TEMP basées sur disque dans la lecture.
Le groupe peut également provoquer une table temporaire, y compris le groupe avec un champ de texte. Mieux vaut faire un CRC32 ou quelque chose et groupe par elle à la place.
Le rapport d'explication peut dire "à l'aide de FiluSort" mais c'est trompeur. Cela ne signifie pas que cela écrit dans un fichier, cela signifie que cela signifie qu'il est triant sans le bénéfice d'un index.
Le rapport explique peut dire "à l'aide de temporaire", mais cela ne signifie pas qu'il utilise une table temporaire sur le disque. Il peut faire une petite table Temp en mémoire. La table doit s'adapter dans le moindre em> de max_heap_table_size et TMP_TABLE_SIZE . Si vous augmentez tmp_table_size, vous devez également augmenter max_heap_table_size à la correspondance. P> Voir aussi http://dev.mysql.com/doc/refman/5.1/fr/internal-temporary-tables.html Pour plus d'informations sur la gestion temporaire de la table. P > mais 4 gigs pour cette valeur est très élevé! Considérez que cette mémoire peut potentiellement être utilisée par connexion em>. La valeur par défaut est de 16 MEGS, alors vous l'avez donc augmenté d'un facteur de 256. P> Nous voulons donc trouver quelles requêtes ont provoqué les tables de disque Temp. P> Si vous exécutez MySQL 5.1 Ou plus tard, vous pouvez SET GLOBAL LONG_Query_Time = 0 Pour faire la sortie toutes les questions em> sur le journal de requête lente. Assurez-vous de le faire uniquement temporairement et de le remettre à une valeur non nulle lorsque vous avez terminé! : -) p> Si vous exécutez Percona Server , le Le journal de requête lente est étendu avec des informations supplémentaires et une configuration, y compris si la requête a provoqué une table Temp ou une table de disque Temp. Vous pouvez même filtrer le journal de requête lente pour inclure uniquement des requêtes qui provoquent une table TEMP ou une table de disque Temp (le lien Docs i Link to). P> Vous pouvez également traiter le journal de requête lente de Percona Server avec MK-Query-Digest et filtre pour des requêtes qui provoquent une table de disque Temp. p>
Si vous utilisez MySQL 5.6 ou plus, vous pouvez utiliser le schéma de performance. Essayez quelque chose comme:
C'était super utile! Merci.