¿Qué es el plan de ejecución de MySQL (palabra clave Explicar)?

El autor de este artículo es Wang Liangchen, el arquitecto de JD Zhongtai, que es bueno en el diseño y la arquitectura de sistemas distribuidos y de alta disponibilidad y alta concurrencia. Ha desarrollado una serie de andamios de uso general para empresas, abogando por el uso de medios técnicos para mejorar la eficiencia del desarrollo y restringir el comportamiento del desarrollo.


Que es explicar

Explicar se llama plan de ejecución. Agrega la palabra clave explicar antes de la declaración. MySQL establecerá una marca en la consulta para simular el optimizador de MySQL para ejecutar la declaración SQL. Cuando se ejecuta la consulta, se devolverá la información del plan de ejecución y no se ejecutará SQL. . (Tenga en cuenta que si from contiene una subconsulta, la subconsulta aún se ejecutará y el resultado se colocará en una tabla temporal).

Explain se puede utilizar para analizar los cuellos de botella de rendimiento de las estructuras de tablas y declaraciones SQL. A través de los resultados de la explicación, puede obtener información como el orden de consulta de la tabla de datos, el tipo de operación de la operación de consulta de datos, qué índices se pueden alcanzar, qué índices se alcanzarán realmente y cuántas filas de registros en cada tabla de datos se consultan.


Explicar la extensión del comando


explicar extendido

Proporcione información de consulta adicional sobre la base deexplicar. Después de ejecutar el explian extendido, la declaración de consulta optimizada se puede obtener mediante el comando show warnings. Puede ver lo que ha hecho el optimizador y también puede estimar la conexión de la tabla a través de algunos datos Filas.


explicar particiones

Usado para analizar la tabla que usa particiones, mostrará las particiones que se pueden usar.


Dos consejos importantes


1. Explique que los resultados se basan en los datos existentes en la tabla de datos.


2. El resultado de Explain tiene una gran relación con la versión de MySQL, y las estrategias de optimización de las diferentes versiones del optimizador son diferentes.

 

Tablas de base de datos utilizadas en los ejemplos de este artículo


Explicar comando (palabra clave)

explicar un ejemplo simple

mysql> explicar seleccionar * de t_user;

Cada "tabla" en la consulta generará una fila. El significado de "tabla" aquí es muy amplio, no solo una tabla de base de datos, sino también una subconsulta, un resultado de unión, etc.


explicar la descripción de la columna de resultados


[Columna de identificación]

La columna de identificación es un número secuencial, que es el número de secuencia de la consulta. Hay varias selecciones para mostrar varias filas. El orden de id aumenta en el orden en el que aparece select. Cuanto mayor sea el valor de la columna de identificación, mayor será la prioridad de ejecución, la primera en ejecutarse, el mismo valor en la columna de identificación se ejecuta de arriba a abajo, y el valor de la columna de identificación es NULL y se ejecuta en último lugar.


【Select_type 列】

El valor de la columna select_type indica el tipo de consulta:

1) simple: indica que la selección correspondiente a la fila actual es una consulta simple, excluyendo subconsultas y uniones

2) primario: indica que la selección correspondiente a la fila actual es la selección más externa en la consulta compleja

3) subconsulta: indica que la selección correspondiente a la fila actual es una subconsulta contenida en la selección (no en la cláusula from)

4) derivado: indica que la selección correspondiente a la fila actual es una subconsulta contenida en la cláusula from.

MySQL creará una tabla temporal para almacenar los resultados de la consulta de la subconsulta. Utilice la siguiente declaración para ilustrar:

explique select (seleccione 1 fromt_user donde user_id = 1) from (seleccione * from t_group donde group_id = 1) tmp;

* Tenga en cuenta que durante el proceso de recopilación de datos, se encontró que las diferentes versiones de MySQL eran inconsistentes. Después de repetidas comparaciones, el resultado de las versiones 5.7 y posteriores es el siguiente:

Obviamente, MySQL está optimizado en este sentido.

* Tenga en cuenta que el rendimiento de Explain difiere enormemente entre las diferentes versiones de MySQL. En algunos escenarios, desde el nivel de declaración, se utilizan índices, pero después del análisis por parte del optimizador, combinado con los datos existentes en la tabla, si MySQL cree que el rendimiento del escaneo completo de la tabla es mejor, entonces Utilizará un escaneo de tabla completo.

5) Unión: indica que la selección correspondiente a la fila actual es la segunda y posterior selección de la unión

6) Resultado de unión: indica que la selección correspondiente a la fila actual es la selección que recupera el resultado de la tabla temporal de unión

explique seleccionar 1 unión todos seleccionar 2 de dual;

       MySQL5.7 y posteriores también están optimizados

[Columna de la tabla]

El resultado de la columna de la tabla indica a qué tabla está accediendo la selección correspondiente a la fila actual. Cuando hay una subconsulta en la cláusula <from> de la consulta, la columna de la tabla tiene el formato <derivedN>, lo que significa que la selección actual depende de la consulta correspondiente a la fila de resultados con id = N, y la consulta con id número de serie = N debe ejecutarse primero. Cuando hay una unión, el valor de la columna de la tabla de UNION RESULT es <unionN1, N2>, y N1 y N2 representan el número de identificación de la fila seleccionada que participa en la unión.


[Tipo de columna]

El resultado de la columna de tipo indica el tipo asociado o el tipo de acceso de la selección correspondiente a la fila actual, es decir, el optimizador decide cómo encontrar las filas en la tabla de datos y el rango aproximado de los registros de filas de datos. Los pros y contras del grado de optimización del valor de esta columna, del mejor al peor, son: nulo> sistema> const> eq_ref> ref> rango> índice> TODOS. En términos generales, para asegurarse de que la consulta alcance el nivel de rango, es mejor llegar a ref.

1) Nulo, el optimizador MySQL descompone la sentencia de la consulta en la etapa de optimización, y el resultado se puede obtener en el proceso de optimización, por lo que no es necesario acceder a la tabla o índice en la etapa de ejecución.

explicar select min (user_id) de t_user;

En este momento, la función min selecciona el valor mínimo en la columna de índice user_id, que se puede completar buscando directamente en el índice, sin acceder a la tabla de datos cuando se ejecuta.

2) const y system: const aparece al comparar todas las columnas de clave primaria o clave única con constantes, el optimizador optimiza la consulta y convierte parte de la consulta en una constante. Hay como máximo una línea coincidente y se lee una vez, lo que es muy rápido. System es un caso especial de constante, y cuando solo hay una coincidencia en la tabla, es system. En este punto, puede usar explicar extendido + mostrar advertencias para ver los resultados de la ejecución.

explicar la selección extendida * de (seleccionar * de t_user donde user_id = 1) tmp;

mostrar advertencias;

Después de que se optimicen MySQL5.7 y versiones posteriores:

3) eq_ref: clave principal (clave principal) o clave única (clave única) Todas las partes constituyentes del índice se utilizan por combinación, y solo se devolverá una fila de datos elegibles. Este es el tipo de conexión en segundo lugar solo después de const.

explicar seleccionar * de t_group_user gu izquierda unirse t_group g ong.group_id = gu.group_id;

4) ref: comparado con eq_ref, el tipo de ref no usa un índice único como una clave primaria o clave única, pero usa un índice común o un prefijo parcial de un índice único conjunto. El índice se compara con un valor determinado , Se pueden encontrar varias filas de datos que cumplen las condiciones.

1. En el siguiente ejemplo, el nombre_grupo utilizado es un índice normal.

explicar seleccionar * de t_group donde group_name = 'group1';

2. Consulta de tabla de asociación

explicar seleccionar g.group_id de t_group gleft join t_group_user gu en gu.group_id = g.group_id;

5) Rango: aparece en operadores como in (), between,>, <,> =. Utilice un índice para consultar un rango determinado de filas.

6) índice: escanea todo el índice de la tabla (el índice se lee del índice, todos los campos tienen índices y todo se lee desde el disco duro), más rápido que TODOS.

explicar seleccionar * de t_group;

7) todo: escaneo completo de la tabla, debe encontrar las filas requeridas de principio a fin. En este caso, es necesario aumentar el índice para optimizar la consulta.

explicar seleccionar * de t_user;


【Teclas_posibles 列】

Los resultados de esta columna indican qué índices puede utilizar la consulta. Pero a veces habrá resultados en la columna possible_keys, y la siguiente columna de clave muestra un valor nulo. Esto se debe a que no hay muchos datos en la tabla en este momento. El optimizador cree que el índice de consulta no es útil para la consulta, por lo que no usa la consulta de índice en su lugar. Se realizó un escaneo completo de la tabla. 

Si el resultado de la columna possible_keys es nulo, indica que no hay un índice relacionado. En este momento, puede mejorar el rendimiento de la consulta optimizando la cláusula where y agregando los índices adecuados.


[Columna clave]

Esta lista indica qué índice utiliza realmente el optimizador para optimizar el acceso a la tabla. Si no se utiliza ningún índice, la columna es nula.


【Key_len

Esta lista muestra la cantidad de bytes usados ​​en el índice, y este valor se puede usar para estimar aproximadamente el uso específico de las primeras columnas en el índice conjunto. 

Las reglas de cálculo de key_len no se repetirán aquí El número de bytes ocupados por diferentes tipos de datos es inconsistente.


[Columna de referencia]

Esta lista aclara las columnas o constantes utilizadas en el valor de búsqueda de la tabla en el índice del registro de la columna clave. Las más comunes son: const (constante), nombre de campo, como user.user_id


[Columna de filas]

Esta lista indica el número de filas que probablemente el optimizador lee y verifica. Es inconsistente con el número real de filas de datos en la mayoría de los casos.


[Columna adicional]

Como sugiere el nombre, esta lista muestra información adicional y el valor de esta columna es muy útil para optimizar SQL. Los valores importantes comunes son los siguientes: 

1) Uso de índice: Todos los campos que se consultan son columnas indexadas (llamadas índices de cobertura) y la condición where es la columna principal del índice, lo que supone un alto rendimiento.

expliqueseleccione group_id, group_name from t_group;

2) usando where: la columna que se consulta no está cubierta por el índice, y la condición where no es la columna principal del índice, lo que significa que el ejecutor de MySQL recibe los datos de la consulta del motor de almacenamiento y luego realiza un "Post-filtro". El llamado "posfiltrado" consiste en leer primero la fila completa de datos y luego verificar si la fila cumple con las condiciones de la cláusula where, dejarla si la cumple y descartarla si no.

explique select * from t_user whereuser_name = 'user1';

3) usando where Usando índice: la columna que se consulta está cubierta por el índice, y la condición where es una de las columnas de índice pero no la columna principal del índice, es decir, no hay forma de consultar los datos elegibles directamente a través del índice

explicar seleccionar * de t_group donde group_name = 'group1';

4) nulo: la columna que se está consultando no está cubierta por el índice, pero la condición where es la columna inicial del índice. El índice se usa en este momento, pero algunas de las columnas no están cubiertas por el índice. Esto se debe lograr mediante una "consulta de regreso a la tabla", no simplemente Cuando se trata del índice, no es del todo inútil

explicar seleccionar * de t_user donde user_id = '1';

5) Usar condición de índice: similar a usar where, la columna de consulta no está completamente cubierta por el índice, y la condición where es el rango de una columna inicial; esta situación no se muestra a través de ejemplos y puede estar relacionada con la versión de MySQL.

6) uso temporal: esto indica que la consulta debe procesarse creando una tabla temporal. Esta situación generalmente se optimiza, utilizando el índice para optimizar. Cree una tabla temporal: distinta, agrupar por, ordenar por, subconsulta, etc.

explique seleccionar nombre_de_usuario distinto de t_user;

explicar seleccionar nombre_grupo distinto fromt_group; --nombre_grupo es la columna de índice

7) usingfilesort: en el caso de usar order by, mysql usará un índice externo para ordenar los resultados en lugar de leer las filas de la tabla en el orden del índice. En este momento, mysql examinará todos los registros elegibles según el tipo de conexión y guardará la clave de clasificación y el puntero de fila, luego clasificará la clave y recuperará la información de la fila en orden. En este caso, considere usar índices para optimizar.

explicar select * from t_user orderby user_name;

explicar select * from t_group order bygroup_name; --group_name es la columna de índice

Sugerencias de optimización de consultas

Combinando la descripción anterior, primero observe el resultado de la columna de tipo. Si el tipo es todo, significa que se espera una exploración completa de la tabla. Por lo general, el costo de un escaneo de tabla completo es relativamente alto. Se recomienda crear un índice apropiado y evitar un escaneo de tabla completo a través de la recuperación del índice.

Echemos un vistazo a los resultados de la columna Extra. Si hay una ordenación Usar temporal o Usar archivos, preste más atención:

El uso de temporal significa que debe crear una tabla temporal para satisfacer sus necesidades, generalmente porque la columna GROUP BY no tiene un índice o porque las columnas GROUP BY y ORDER BY son diferentes, también debe crear una tabla temporal. Se recomienda agregar un índice apropiado.

El uso de ordenación de archivos significa que el índice no se puede usar para completar la ordenación, o puede deberse a que el campo de ordenación no es un campo en la tabla inicial cuando hay varias tablas conectadas, por lo que no hay forma de usar el índice para completar la ordenación. Se recomienda agregar un índice apropiado.

El uso de where es generalmente porque cuando se realiza un escaneo de tabla completo o un escaneo de índice completo (la columna de tipo se muestra como TODO o índice), y se agrega la condición WHERE, se recomienda agregar un índice apropiado.



Análisis de uso de índices


Tabla de base de datos

Índice de clave principal: demo_id

Índice de articulaciones: c1, c2, c3

Descripción de ejemplo


Ejemplo 1:

explique select * from t_demo donde c1 = 'd1' y c2 = 'd2' y c3 = 'd3';

explique select * from t_demo donde c2 = 'd2' y c1 = 'd1' y c3 = 'd3';

explique select * from t_demo donde c3 = 'd3' y c1 = 'd1' y c2 = 'd3';

Varios SQL realizan lo mismo

tipo = ref, ref = const, const, const

Al realizar consultas equivalentes constantes, cambiar el orden de las columnas de índice no cambiará el resultado de ejecución de la explicación. El optimizador lo optimizará. Se recomienda escribir sentencias SQL en el orden de índice.

Columna real dos:

explique select * from t_demo donde c1 = 'd1' y c2> 'd2' y c3 = 'd3';

explicar seleccionar * de t_demo donde c1 = 'd1' y c3> 'd3' y c2 = 'd2';

En el primer ejemplo, el índice del lado derecho del rango no es válido y se utilizan dos índices.

En el segundo ejemplo, los tres índices se utilizan debido a la optimización del optimizador.


Ejemplo 3:

explique select * from t_demo dondec1> 'c' y c2 = 'd2' y c3 = 'd3';

explique select * from t_demo dondec1> 'e' y c2 = 'd2' y c3 = 'd3';

En los dos ejemplos anteriores, puede encontrar que también se usa la consulta de rango de columnas de índice más a la izquierda. En algunos casos, el índice no se usa y se realiza un escaneo completo de la tabla (el primer ejemplo); en algunos casos, se usa el índice (el segundo ejemplo).

Después de una verificación repetida, se encuentra que las siguientes reglas (no necesariamente confiables) también pueden estar relacionadas con la primera fila o el valor mínimo de los datos.

1. Relacionado con los datos almacenados

2. Bajo la condición mayor que, si los datos de la condición son menores que los datos de la columna, el índice no es válido, si los datos de la condición son mayores que los datos de la columna, el índice es válido;

Al diseñar las condiciones de consulta, preste atención a evitarlas.

Para el primer ejemplo, el índice de cobertura se puede utilizar para optimizar.


Ejemplo cuatro:

explique select * from t_demo donde c1 = 'd1' y c2 = 'd2' orden por c3;

explicar select * from t_demo donde c1 = 'd1'order by c3;

explique select * from t_demo donde c1 = 'd1' y c3 = 'd3' orden por c2;

Ordenar por clasificación usa el índice y no usa el índice


Ejemplo cinco:

explicar select * from t_demo donde c1 = 'd1' y c4 = 'd4' ordenar por c1, c2;

La columna condicional contiene columnas que no están indexadas y aparece la clasificación Using file


Ejemplo 6:

explicar seleccionar * de t_demo donde c1 = 'd1' y c4 = 'd4' agrupar por c1, c2;

Aparecen escenas con muy bajo rendimiento, tanto en Uso temporal como en Uso de ordenación de archivos



para resumir

1. Hay dos formas de ordenar el orden de los archivos y el índice. Usar índice significa que MySQL escanea el índice para completar la ordenación. La eficiencia del índice es alta y la eficiencia del ordenamiento de archivos es baja.

2. Se utilizará el índice cuando el pedido cumpla con dos condiciones.

1) La instrucción order by utiliza la columna más a la izquierda del índice.

2) Utilice la cláusula where y la combinación de columnas condicionales order by cláusula para satisfacer la columna frontal más a la izquierda del índice.

3. Intente completar la clasificación en la columna de índice y siga la regla del mejor prefijo izquierdo al indexar (el orden de creación del índice).

4. Agrupar por es muy similar a ordenar por, ambos se ordenan primero y luego se agrupan, siguiendo la regla del mejor prefijo izquierdo del orden de creación del índice.

-----FIN-----

Amigos a los que les gusta este artículo, bienvenidos a seguir al programador de cuentas oficial  Xiaohui y ver contenido más emocionante.

点个[在看],是对小灰最大的支持!

Supongo que te gusta

Origin blog.csdn.net/bjweimengshu/article/details/109088693
Recomendado
Clasificación