¿Cómo determinar el tamaño óptimo de sort_buffer_size?

10

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?

Desbordamiento de preguntas
fuente
¿Ha ejecutado mysqltuner o tuning-primer ? Puede ver algo interesante sobre su my.cnf en estas aplicaciones.
David Martinez

Respuestas:

14

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:

Sort_merge_passes: el número de pasadas de fusión que el algoritmo de clasificación ha tenido que hacer. Si este valor es grande, debería considerar aumentar el valor de la variable de sistema sort_buffer_size .

Tenga en cuenta una cosa sobre sort_buffer_size

Si ve muchos Sort_merge_passes por segundo en la salida SHOW GLOBAL STATUS, puede considerar aumentar el valor sort_buffer_size para acelerar las operaciones ORDER BY o GROUP BY que no pueden mejorarse con la optimización de consultas o la indexación mejorada

Si bien elevar sort_buffer_sizepuede ayudar a las consultas con GROUP BYsy ORDER BYs, 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.

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

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:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

Luego agregaría esto a my.cnf

[mysqld]
sort_buffer_size = 4M

Ejecutaría el código periódicamente para verificar otras veces picos de Sort_merge_passes .

RolandoMySQLDBA
fuente
2
Esta es la respuesta mucho mejor
Greg
77
@RolanoMySQLDBA puede definir "muchos" en lo siguiente: "Si ve muchos Pases_de_mezcla por segundo"
Tarek
2

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/

eroomydna
fuente
Lamento decir que la publicación me parece poco útil. Es como decirle a la gente que no haga algo solo porque no eres un experto. Como señaló el primer comentarista, los .cnfarchivos de muestra enviados con mysql no usan la configuración predeterminada.
Pregunta Desbordamiento
Si lo vuelve a leer, también dice que el experto ya sabe que no debe cambiar el valor predeterminado. Los archivos .cnf de muestra no se deben usar ni hacer referencia como una buena práctica. Si necesita ayuda para construir un archivo my.cnf, Percona le ofrece un asistente bastante completo. tools.percona.com/wizard
eroomydna
2

La guía en el manual (5.0-5.5) es

Si ve muchos Sort_merge_passes por segundo en la salida SHOW GLOBAL STATUS, puede considerar aumentar el valor sort_buffer_size para acelerar las operaciones ORDER BY o GROUP BY que no pueden mejorarse con la optimización de consultas o la indexación mejorada. El búfer completo se asigna incluso si no es todo lo necesario, por lo que configurarlo más grande de lo requerido globalmente ralentizará la mayoría de las consultas de ese tipo. Es mejor aumentarlo como una configuración de sesión, y solo para las sesiones que necesitan un tamaño mayor. En Linux, hay umbrales de 256 KB y 2 MB donde los valores más grandes pueden ralentizar significativamente la asignación de memoria, por lo que debe considerar mantenerse por debajo de uno de esos valores. Experimente para encontrar el mejor valor para su carga de trabajo.

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.

A partir de MySQL 5.6.4, el optimizador intenta calcular cuánto espacio se necesita pero puede asignar más, hasta el límite.

ClearCrescendo
fuente
1

La mejor manera de determinar el óptimo sort_buffer_sizees compararlo.

¿Cómo? Como @RolandoMySQLDBA dijo que la comprobación Sort_merge_passespodría ser útil, pero ese no es el único factor que afecta el rendimiento. Debes tener cuidado cuando aumentas el sort_buffer_size.

El documento dice que

En Linux, hay umbrales de 256 KB y 2 MB donde los valores más grandes pueden ralentizar significativamente la asignación de memoria, por lo que debe considerar mantenerse por debajo de uno de esos valores.

Hay una publicación sobre las pruebas que concluye que

sort_merge_passesNo son tan malos. Establecer su sort_buffer_sizetamaño lo suficientemente grande para que haya cero sort_merge_passespuede no ser óptimo.

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ó.

Sanghyun Lee
fuente
-1

"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.

Moorer
fuente
1
¿Cómo puede ocurrir una clasificación grande en un búfer de clasificación 4K? Tenga en cuenta que usted dijo 1024 * 4. Eso es 4096, 4K.
RolandoMySQLDBA
Lo que dijo Rolando ^^. Y el valor mínimo permitido es 32K.
ypercubeᵀᴹ