J'ai lu un exemple de fichier de configuration qui dit ce qui suit:
# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.
J'ai quelques requêtes qui utilisent filesort. Comment déterminer la taille de la mémoire tampon dont j'ai besoin pour que les requêtes s'exécutent correctement sans toucher le disque?
Réponses:
Il n'y a qu'une seule variable d'état qui se soucie de sort_buffer_size . C'est ce que vous avez dans le message de retour dans la question: Sort_merge_passes . La documentation MySQL dit:
Veuillez garder à l'esprit une chose à propos de sort_buffer_size
Bien que l'augmentation
sort_buffer_size
puisse aider les requêtes avecGROUP BY
s etORDER BY
s, il vaut mieux améliorer les requêtes que vous pouvez améliorer et ajouter des index pouvant être utilisés par l'Optimiseur de requête.La question demeure: comment vérifiez-vous les Sort_merge_passes ???
Utilisez ce code pour vérifier combien de Sort_merge_passes se sont produits au cours des 5 dernières minutes. Il calcule également les Sort_merge_passes par heure.
Si vous trouvez les Sort_merge_passes et le taux trop élevés, alors n'hésitez pas à augmenter sort_buffer_size . Supposons que vous souhaitiez augmenter à 4M. Vous exécuteriez ceci:
Vous ajouteriez ensuite ceci à my.cnf
Vous devez exécuter le code périodiquement pour vérifier les autres pointes de Sort_merge_passes .
la source
Vous n'avez pas besoin de changer la valeur sort_buffer_size par défaut. Vous vous méprenez sur son utilisation en fonction de la question. Vous devez commencer par examiner le SQL pour voir si vous pouvez le régler et satisfaire les conditions ORDER BY / GROUP BY à l'aide d'un index. Ce sera généralement un indice composite.
Plus loin: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/
la source
.cnf
fichiers livrés avec mysql n'utilisent pas le paramètre par défaut.Les directives du manuel (5.0-5.5) sont
À partir de 5.6, le libellé indique que l'optimiseur peut choisir une valeur pour une requête et que le serveur peut étendre le tampon jusqu'à la limite. Cela atténue le coût de définition d'une valeur trop élevée. Il semble donc que vous souhaitiez être conservateur, inférieur à la valeur par défaut (comme le font les fichiers cnf) pour les versions inférieures à 5.6.4, mais vous pouvez vous permettre d'avoir une limite supérieure de 2 Mo par défaut, voire plus, à partir de 5.6. 4 car le montant total n'est pas alloué aveuglément.
la source
La meilleure façon de déterminer l'optimum
sort_buffer_size
est de le comparer.Comment? Comme @RolandoMySQLDBA, la vérification
Sort_merge_passes
pourrait être utile, mais ce n'est pas le seul facteur qui affecte les performances. Vous devez être prudent lorsque vous augmentez lesort_buffer_size
.Le document dit que
Il y a un article sur les tests qui conclut que
Lorsque j'ai testé, j'obtiens également un résultat similaire.
Idéalement, il serait préférable d'éviter la situation dont vous avez besoin pour optimiser le
sort_buffer_size
. Comment? Ce document ORDER BY Optimization pourrait vous aider à comprendre comment les choses fonctionnent sous le capot.la source
"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" c'est une mauvaise façon de mettre dans 4 m la taille du tampon de tri, cela fait que la taille du tampon de tri a une utilisation de 4 Go
"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"
Si j'ai été votre, je n'essaye pas de changer la taille courte du tampon, c'est un bon moyen de faire planter votre serveur et d'envoyer à la corbeille les performances. Il vaut mieux essayer de faire de meilleures requêtes.
la source
1024 * 4
. C'est 4096, 4K.