¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL? (Serie de 1 minuto)

El artículo "La base de datos permite valores nulos, que a menudo es el comienzo de una tragedia" utiliza explica para analizar el plan de ejecución de SQL para analizar el impacto de nulos en los aciertos de índice. Muchos amigos dejaron un mensaje preguntando sobre el campo de tipo, ref, ALL, etc. en el resultado de la explicación. ¿Qué significa el valor diferente?

Dedique 1 minuto hoy a hablar brevemente sobre los resultados de tipo común y su significado, y a través de la diferencia de rendimiento de la misma declaración SQL, muestra lo importante que es construir el índice.

¿Qué significa el campo de tipo en el resultado de explicación?

¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
El sitio web oficial de MySQL explica de manera muy concisa, usando solo 3 palabras: el tipo de unión. Describe el método de escaneo utilizado para encontrar los datos requeridos.

Los métodos de escaneo más comunes son:

  • sistema: tablas del sistema, una pequeña cantidad de datos, a menudo no es necesario realizar E / S de disco;
  • const: conexión constante;
  • eq_ref: índice de clave principal (clave principal) o índice único no vacío (único no nulo) exploración equivalente;
  • ref: escaneo equivalente de índice no único de clave no primaria;
  • rango: escaneo de rango;
  • índice: escaneo de árbol de índice;
  • TODOS: escaneo de tabla completo;
    voz en off: estos son los más comunes. Todos van a explicar las declaraciones SQL en su trabajo. El 95% de ellos son de los tipos anteriores.

Los métodos de exploración anteriores son de rápido a lento:
sistema> const> eq_ref> ref> rango> índice> TODOS
Los siguientes ejemplos ilustran uno por uno.

Uno, sistema

¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)

explicar select * from mysql.time_zone;

En el ejemplo anterior, los datos se consultan desde la tabla del sistema time_zone de la biblioteca del sistema mysql y el tipo de código de escaneo es system.Los datos se han cargado en la memoria y no se requiere E / S de disco.

Este tipo de escaneo es el más rápido.

¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)

explicar seleccionar de (seleccionar de usuario donde id = 1) tmp;

Para dar otro ejemplo, el anidamiento interno (const) devuelve una tabla temporal y el anidamiento externo se consulta desde la tabla temporal. El tipo de escaneo también es del sistema, y ​​no hay necesidad de usar E / S de disco, que es súper rápido.

Dos, const

preparación de datos:

crear usuario de tabla (
id int clave primaria,
nombre varchar (20)
) motor = innodb;

insertar en los valores de usuario (1, 'shenjian');
insertar en los valores de usuario (2, 'zhangsan');
insertar en los valores de usuario (3, 'lisi');

¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
Las condiciones para la exploración constante son:
(1) Pulse la clave principal o índice único;
(2) La parte conectada es un valor constante (constante);

explicar seleccionar * del usuario donde id = 1;

Como en el ejemplo anterior, id es PK y la parte de conexión es la constante 1.
Voz en off: No se involucre en ningún tipo de conversión Yaomo.

Este tipo de eficiencia de escaneo es extremadamente alta, la cantidad de datos devueltos es pequeña y la velocidad es muy rápida.

Tres, eq_ref

preparación de datos:

crear usuario de tabla (
id int clave primaria,
nombre varchar (20)
) motor = innodb;

insertar en los valores de usuario (1, 'shenjian');
insertar en los valores de usuario (2, 'zhangsan');
insertar en los valores de usuario (3, 'lisi');

crear tabla user_ex (
id int clave principal,
edad int
) engine = innodb;

insertar en valores user_ex (1,18);
insertar en valores user_ex (2,20 ); insertar en valores user_ex (3,30);
insertar en valores user_ex (
4,40);
insertar en valores user_ex (5,50);
¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
La condición del escaneo de eq_ref es que para cada fila de la tabla anterior, solo se escanea una fila de la última tabla.

Refina un poco más:
(1) consulta de unión;
(2) pulsa la clave principal o índice único no nulo;
(3) unión de equivalencia;

explique select * from user, user_ex donde user.id = user_ex.id;
Como en el ejemplo anterior, id es la clave principal y la consulta de unión es un escaneo eq_ref.

Este tipo de escaneo también es extremadamente rápido.

Cuatro, ref

Preparación de datos:
crear una tabla de usuario (
id int,
nombre varchar (20),
index (id)
) engine = innodb;

insertar en los valores de usuario (1, 'shenjian');
insertar en los valores de usuario (2, 'zhangsan');
insertar en los valores de usuario (3, 'lisi');

crear tabla user_ex (
id int,
age int,
index (id)
) engine = innodb;

insertar en valores user_ex (1,18);
insertar en valores user_ex (2,20 ); insertar en valores user_ex (3,30);
insertar en valores user_ex (
4,40);
insertar en valores user_ex (5,50);
¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
Si el índice de clave principal en el caso eq_ref del ejemplo anterior se cambia a un índice no único normal.

explique select * from user, user_ex donde user.id = user_ex.id;
se rebaja de eq_ref a ref. En este momento, para cada fila de la tabla anterior, puede haber más de una fila de datos escaneados en la tabla posterior.
¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)

explique select * from user donde id = 1;
Cuando id se cambia a índice ordinario no único, la consulta de unión constante también se degrada de const a ref, porque puede haber más de una fila de datos escaneados.

El escaneo de referencias puede aparecer en combinaciones o en índices ordinarios de una sola tabla. Puede haber varias filas de datos devueltos para cada coincidencia. Aunque es más lento que eq_ref, sigue siendo un tipo de combinación rápida.

Cinco, rango

Preparación de datos:
crear una tabla de usuario (
id int clave primaria,
nombre varchar (20)
) engine = innodb;

insertar en valores de usuario (1, 'shenjian');
insertar en valores de usuario (2, 'zhangsan');
insertar en valores de usuario (3, 'lisi');
insertar en valores de usuario (4, 'wangwu');
insertar en valores de usuario (5, 'zhaoliu'); El
¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
escaneo de rango es más fácil de entender, es una consulta de rango en el índice, escaneará el valor de un rango específico en el índice.

explicar seleccionar de usuario donde id entre 1 y 4;
explicar seleccionar
de usuario donde idin (1,2,3);
explicar seleccionar * de usuario donde id> 3;
como en el ejemplo anterior, entre, en,> son todos los rangos típicos (rango) consulta.
Voz en off: debe ser un índice, de lo contrario no se puede "saltar" por lotes.

Seis, índice

¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
Tipo de índice, debe escanear todos los datos del índice.

explique el recuento (*) del usuario;
como en el ejemplo anterior, id es la clave principal y la consulta del recuento debe contarse escaneando todos los datos del índice.
Voz en off: esta tabla es el motor InnoDB.

Es solo un poco más rápido que un escaneo de tabla completo.

Siete, TODOS

Preparación de datos:
crear una tabla de usuario (
id int,
nombre varchar (20)
) engine = innodb;

insertar en los valores de usuario (1, 'shenjian');
insertar en los valores de usuario (2, 'zhangsan');
insertar en los valores de usuario (3, 'lisi');

crear tabla user_ex (
id int,
age int
) engine = innodb;

insertar en valores user_ex (1,18);
insertar en valores user_ex (2,20 ); insertar en valores user_ex (3,30);
insertar en valores user_ex (
4,40);
insertar en valores user_ex (5,50);
¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
explique select * from user, user_ex donde user.id = user_ex.id;
Si no se construye un índice en la identificación, para cada fila (fila) de la tabla anterior, la última tabla debe escanearse en su totalidad.

En el artículo de hoy, esta misma declaración de unión aparece tres veces:
(1) El tipo de escaneo es eq_ref, e id es la clave principal en este momento;
(2) El tipo de escaneo es ref, y el id es un índice ordinario no único en este momento;
(3) Escaneo El tipo es TODO, escaneo de tabla completo, sin índice en la identificación en este momento;

Esto muestra lo importante que es establecer el índice correcto para mejorar el rendimiento de la base de datos.

Además, "El gran agujero causado por la conversión de tipos" también menciona que las declaraciones SQL incorrectas pueden causar un escaneo completo de la tabla.

El escaneo de la tabla completa es extremadamente costoso y tiene bajo rendimiento. Debe evitarse tanto como sea posible. Es muy necesario analizar las sentencias SQL a través de explicaciones.

para resumir

(1) El campo de tipo en el resultado de explicación representa el tipo de conexión (generalizada), que describe el método de escaneo utilizado para encontrar los datos requeridos;
(2) Los tipos de escaneo comunes son:
sistema> const> eq_ref> ref> rango> índice>
La velocidad de escaneo de TODOS es de rápida a lenta;
(3) Los puntos principales de varios tipos de escaneo son:

  • El sistema más rápido: sin E / S de disco
  • const: consulta equivalente en PK o única
  • eq_ref: consulta de combinación en PK o coincidencia única de igual valor, para cada fila de la tabla anterior (fila), solo una fila de los resultados de la última tabla
  • ref: índice no único, coincidencia de igual valor, se pueden alcanzar varias filas
  • rango: Escaneo de rango en el índice, por ejemplo: entre / in />
  • índice: el escaneo de conjunto completo en el índice, por ejemplo: recuento de InnoDB
  • TODO es el más lento: escaneo completo de la tabla
    (4) Es muy importante establecer el índice correcto (índice);
    (5) Es muy importante utilizar la explicación para comprender y optimizar el plan de ejecución;

Las ideas son más importantes que las conclusiones y espero que todos salgan ganando.
Voz en off: este artículo se ha probado en MySQL5.6. Recomendaciones relacionadas con las
¿Por qué hay una diferencia tan grande en el rendimiento de la misma instrucción SQL?  (Serie de 1 minuto)
ideas técnicas de Road-Sharing del arquitecto
:
"Grupo intermedio (grupo intermedio), ¡comprenda bien esta vez! ! ! "
Escriba el búfer (cambie el búfer), comprenda bien esta vez!" ! ! "
Dos tipos de escaneos de tabla completa muy ocultos | Serie de 1 minuto"
"Diferencias de índice MyISAM e InnoDB | Serie de 1 minuto"
"La base de datos permite nulo, el comienzo de la tragedia | Serie de 1 minuto"

Supongo que te gusta

Origin blog.51cto.com/jyjstack/2548578
Recomendado
Clasificación