web-dev-qa-db-fra.com

Éviter les tables temporaires lors du tri par une colonne dans une table différente

J'ai donc cette requête MySQL InnoDB ici:

SELECT s.vid, s.body, s.timestamp, COUNT(v.id) AS votecnt
FROM stories s
LEFT JOIN votes v ON s.vid = v.vid
WHERE s.lv = 1
AND s.status = 1
GROUP BY s.vid
ORDER BY votecnt DESC

et le profilage montre que plus de 93% du délai requis pour exécuter cette requête est nécessaire pour copier la table temporaire des résultats pour une commande supplémentaire de VETECNT. Que peut-on faire pour la rendre plus rapide?

Expliquer la sortie:

| 1 | Simple | S | Ref | nouveau | nouveau | 2 | const, const | 19873 | En utilisant où; En utilisant temporaire; Utilisation de FiltrySort |

| 1 | Simple | v | Ref | Votes | Votes | 4 | Sikna_ci.s.Vid | 1 | En utilisant index |

6
donk

Vous devrez peut-être également augmenter les variables suivantes:

Si ceux-ci sont trop petits, le ténpable va rapidement sur le disque.

Si ceux-ci sont trop volumineux, la table TMP passe rapidement lorsque la limite est dépassée mais crée une intermittence en raison de la déplacement de la grande mémoire en mémoire sur le disque avant de terminer l'utilisation de TMPTable.

Vous devez donc effectuer un acte d'équilibrage étroit avec ces variables de table TMP. Ces variables ont également la même contrainte de threads que @DTest mentionné dans cette réponse.

BTW En théorie, un tampon de tri est une option tttable en elle-même, bien que régie par une option de session différente ( Sort_buffer_size ). Depuis que vous triez avec une colonne de groupe et non une colonne établie de la table pure, les Temphables sont quelque peu inévitables.

7
RolandoMySQLDBA

La page manuelle pour Commande par optimisation Peut vous aider, en particulier le résumé de la suggestion à la fin de l'article. Soyez prudent sur l'augmentation de Sort_Buffer_Size et Read_RND_Buffer_Size, car je pense qu'ils sont des valeurs "par fil", ce qui signifie que chaque thread de connexion MySQL sera attribué à la mémoire de chaque valeur. Si trop grand, vous pouvez trouver votre serveur à court de mémoire rapide.

6
Derek Downey

Si 93% de l'exécution de la requête est utilisée pour les tables temporaires, ce n'est pas nécessairement une mauvaise chose. Les tables temporaires sont gérées en interne par le système d'exploitation DB et seront assez rapides. Pour accélérer la requête, vous pouvez perdre la commande par clause.

1
StanleyJohns