Leí de un archivo de configuración de muestra que dice lo siguiente:
# 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.
Tengo un par de consultas que usan filesort. ¿Cómo determino cuál es el tamaño del búfer que necesito para que las consultas se ejecuten sin problemas sin golpear el disco?
Respuestas:
Solo hay una variable de estado que se preocupa por sort_buffer_size . Eso es lo que tienes en el mensaje en la pregunta: Sort_merge_passes . La documentación de MySQL dice:
Tenga en cuenta una cosa sobre sort_buffer_size
Si bien elevar
sort_buffer_size
puede ayudar a las consultas conGROUP BY
syORDER BY
s, es mejor mejorar las consultas que puede mejorar y agregar índices que puede utilizar el Optimizador de consultas.La pregunta sigue siendo: ¿Cómo verifica los Sort_merge_passes ???
Use este código, para verificar cuántos Sort_merge_passes ocurrieron en los últimos 5 minutos. También calcula los Sort_merge_passes por hora.
Si encuentra que Sort_merge_passes y la tasa son demasiado altas, no dude en aumentar sort_buffer_size . Supongamos que quieres subir a 4M. Ejecutarías esto:
Luego agregaría esto a my.cnf
Ejecutaría el código periódicamente para verificar otras veces picos de Sort_merge_passes .
fuente
No es necesario que cambie sort_buffer_size de forma predeterminada. Usted malinterpreta su uso basado en la pregunta. Debe comenzar examinando el SQL para ver si puede ajustarlo y satisfacer las condiciones ORDER BY / GROUP BY utilizando un índice. Generalmente será un índice compuesto.
Además: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/
fuente
.cnf
archivos de muestra enviados con mysql no usan la configuración predeterminada.La guía en el manual (5.0-5.5) es
Desde 5.6 en adelante, la redacción indica que el optimizador puede elegir un valor para una consulta y que el servidor puede extender el búfer hasta el límite. Esto mitiga el costo de establecer el valor demasiado alto. Por lo tanto, parece que es posible que desee ser conservador, inferior al predeterminado (como lo hacen los archivos cnf de lanzamiento) para las versiones inferiores a 5.6.4, pero puede permitirse tener un límite más alto de decir los 2 MB predeterminados, o incluso más, desde 5.6. 4 ya que el monto total no se asigna a ciegas.
fuente
La mejor manera de determinar el óptimo
sort_buffer_size
es compararlo.¿Cómo? Como @RolandoMySQLDBA dijo que la comprobación
Sort_merge_passes
podría ser útil, pero ese no es el único factor que afecta el rendimiento. Debes tener cuidado cuando aumentas elsort_buffer_size
.El documento dice que
Hay una publicación sobre las pruebas que concluye que
Cuando probé, también obtuve un resultado similar.
Idealmente, sería mejor evitar la situación que necesita para optimizar el
sort_buffer_size
. ¿Cómo? Este documento de optimización ORDER BY puede ayudarlo a comprender cómo funcionan las cosas bajo el capó.fuente
"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" es una mala manera de colocar 4m del tamaño del buffer de clasificación, eso hace que el tamaño del buffer de clasificación tenga un uso de 4GB
"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"
Si he sido tuyo, no trato de cambiar el tamaño del búfer corto, esa es una buena manera de bloquear el servidor y enviarlo a la basura. Es mejor intentar hacer mejores consultas.
fuente
1024 * 4
. Eso es 4096, 4K.