Hablemos de cómo MySQL maneja la clasificación.

Este artículo se comparte desde la comunidad de la nube de Huawei " ¿Cómo maneja MySQL la clasificación? ️ ¿Cómo optimizar las consultas que deben ordenarse?" ", autor: La cocina privada de Caicai.

Prefacio

Estas dos palabras clave se utilizan a menudo en consultas MySQL. order by  group by 

Lo que tienen en común es que todos ordenan los campos. Entonces, ¿cómo se implementa la clasificación en la declaración de consulta?

Hay dos situaciones de procesamiento en las que es necesario ordenar la declaración de consulta utilizada:

  1. Los registros actuales están inherentemente ordenados y no es necesario ordenarlos.
  2. El registro actual no mantiene el orden y debe ordenarse

Utilice índices para garantizar el pedido

Para el primer caso, el orden de las columnas del índice en el índice secundario se utiliza a menudo para garantizar el orden del conjunto de resultados, de modo que no sea necesario ordenar.

Para la tabla a, cree un índice secundario para a2, luego a2 se ordenará en el índice secundario.

CREAR TABLA `a` (
   `a1` int(11) NO NULL AUTO_INCREMENT,
   `a2` varchar(255) CONJUNTO DE CARACTERES utf8mb4 POR DEFECTO NULO,
   `a3` varchar(255) POR DEFECTO NULO,
   CLAVE PRIMARIA (`a1`),
   CLAVE `idx_a2` (`a2`)
 ) MOTOR = InnoDB AUTO_INCREMENT = 76 JUEGO DE CARACTERES PREDETERMINADO = utf8;

select * from a order by a.a2 limit 10

Cuando el optimizador elige utilizar el índice a2, los registros de la columna a2 están ordenados, por lo que no es necesario utilizar otros gastos generales para la clasificación.

imagen.png

Por supuesto, es posible que el optimizador no use el índice a2 (cuando el optimizador piensa que usar a2 para devolver la tabla es demasiado costoso, utilizará un escaneo completo de la tabla)

imagen.png

Cuando a2 no está ordenado en el índice utilizado por el optimizador, los resultados se ordenarán por otros medios.

ordenar archivos

Cuando aparezca la información adicional del plan de ejecución , se utilizará sort_buffer para ordenar los resultados. Using filesort 

sort_buffer es una parte de la memoria que se utiliza para ordenar. sort_buffer puede almacenar todos los campos necesarios para la consulta o puede almacenar solo los campos y las claves principales que deben ordenarse.

show variables like 'max_length_for_sort_data'

Cuando la longitud de los campos requeridos por la consulta es menor que 1 , todos los campos requeridos por la consulta se colocarán en sort_buffer, luego se ordenarán las columnas que deben ordenarse y finalmente se devolverán los resultados. max_length_for_sort_data 

imagen.png

Cuando la longitud del campo requerido para la consulta es mayor que la longitud del campo , solo los campos y los valores de clave principal que deben ordenarse se colocarán en sort_buffer, y luego se consultará el índice agrupado para obtener el columnas que deben consultarse después de ordenar (equivalente a un regreso más a la tabla) max_length_for_sort_data 

imagen.png

Al ordenar en sort_buffer, si hay suficiente memoria, la clasificación se realizará en la memoria. Si no hay suficiente memoria, se utilizará el archivo temporal en el disco para ayudar en la clasificación.

Actívelo para ver si se utilizan archivos temporales para ayudar en la clasificación. optimizer_trace 

#Habilitar seguimiento del optimizador
 SET optimizador_trace='enabled=on';
 #declaraciónsql
 seleccione * del pedido de estudiantes por límite de nombre_estudiante 10000;
 #Ver la información rastreada por el optimizador
 SELECCIONE * DE `esquema_información`.`OPTIMIZER_TRACE`\G;

El algoritmo utilizado para la clasificación es el algoritmo de combinación. Primero se divide en varios archivos pequeños, se clasifica y luego se fusiona.

¿Dónde number_of_tmp_files está la cantidad de archivos temporales utilizados y sort_buffer_size el tamaño de sort_buffer?

imagen.png

Por lo tanto, cuando se utilizan ordenar por, agrupar por y otras palabras clave que deben ordenarse, es mejor establecer un índice adecuado.

Si la cantidad de datos es pequeña, se puede ordenar en el búfer de clasificación. Si la cantidad de datos es demasiado grande, es necesario interactuar con el disco.

Resumir

Cuando es necesario ordenar la declaración de consulta, se dividirá en dos situaciones: sin clasificación y es necesario ordenar.

Cuando el índice utilizado está en orden, no es necesario ordenarlo y el orden se garantiza a través del índice.

Cuando el índice utilizado está desordenado, se utilizará sort_buffer para ordenar. Cuando la longitud del campo de consulta no exceda el límite, cada registro en sort_buffer almacenará la columna que debe consultarse.

Si se excede el límite, sort_buffer solo almacenará las columnas y los valores de clave principal que deben ordenarse. Después de ordenar, los valores de clave principal se utilizan para devolver la tabla para obtener las columnas que deben consultarse.

Cuando la cantidad de datos es demasiado grande para ordenarlos en la memoria, se utilizarán páginas del disco para ayudar en la clasificación y se utilizará un algoritmo de combinación para dispersar los datos ordenados en varias páginas y luego fusionarlas.

Puede analizar el contenido a través del optimizador de seguimiento optimizador_trace para ver la cantidad de páginas auxiliares y otra información.

Cree índices apropiados para las columnas que deben ordenarse para evitar el uso de clasificación asistida por páginas en disco.

El búfer de clasificación o max_length_for_sort_data se pueden ajustar cuando no se puede utilizar la indexación (con precaución)

Haga clic para seguir y conocer las nuevas tecnologías de Huawei Cloud lo antes posible ~

El equipo de inteligencia artificial de China de Microsoft empacó colectivamente y se fue a los Estados Unidos, involucrando a cientos de personas. ¿Cuántos ingresos puede generar un proyecto desconocido de código abierto? Huawei anunció oficialmente que la posición de Yu Chengdong se ajustó en la estación espejo de código abierto de la Universidad de Ciencia y Tecnología de Huazhong. ¡Los estafadores abrieron oficialmente el acceso a la red externa y utilizaron TeamViewer para transferir 3,98 millones! ¿Qué deberían hacer los proveedores de escritorio remoto? La primera biblioteca de visualización front-end y fundador del conocido proyecto de código abierto de Baidu, ECharts, un ex empleado de una conocida empresa de código abierto que "se fue al mar" dio la noticia: después de ser desafiado por sus subordinados, el técnico El líder se puso furioso y grosero y despidió a la empleada embarazada. OpenAI consideró permitir que la IA genere contenido pornográfico. Microsoft informó a The Rust Foundation que donó 1 millón de dólares estadounidenses. Por favor, dígame cuál es el papel de time.sleep(6) aquí. ?
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4526289/blog/11138574
Recomendado
Clasificación