[Notas del estudio de MySQL (12)] optimizador de consultas optimización basada en reglas y optimización de subconsultas

¡Este artículo es publicado por la cuenta oficial [Developing Pigeon]! ¡Bienvenido a seguir! ! !


Old Rules-Sister Town House:

Uno. Optimización basada en reglas del optimizador de consultas

(I. Resumen

       El optimizador de consultas optimiza la declaración de la consulta de acuerdo con las reglas correspondientes y la convierte en un formulario que se puede ejecutar de manera eficiente. Este proceso se denomina reescritura de consultas.

(2) Simplificación condicional

1. Quite los paréntesis innecesarios

       Quite los paréntesis adicionales en la expresión.

2. Pases constantes

       Si una columna y una constante se han emparejado con el mismo valor, cuando se usa el operador AND para conectar esta expresión con otras expresiones que involucran a la columna, la columna se puede convertir en una constante.

Tal como:

a = 5 AND b > a

a = 5 AND b > 5

3. Eliminar condiciones conocidas

       Para las expresiones que son obviamente VERDADERAS o FALSAS, el optimizador las elimina.

4. Cálculo de expresiones

       Antes de que se ejecute la consulta, si la expresión contiene solo constantes, su valor se calculará primero.

5. Detección constante de la mesa

       Para tablas con no más de 1 registro o tablas con claves primarias coincidentes y columnas de índice secundario únicas, debido a que estos dos tipos de tablas toman muy poco tiempo para consultarse, se denominan tablas constantes. Cuando el optimizador de consultas analiza una declaración de consulta, primero realiza una detección de tabla constante para ver si hay una tabla constante y luego reemplaza todas las condiciones que involucran la tabla en la consulta con constantes y luego analiza el costo de consulta de otras tablas.


(3) Eliminación de conexiones externas

       ¿Por qué eliminar las uniones externas? Porque la combinación interna puede evaluar el costo del orden de combinación diferente de la tabla a través del optimizador y seleccionar el orden de combinación de menor costo para ejecutar la consulta.

       Después de conocer el motivo, veamos cómo eliminarlo. Todos los registros que no cumplan con las condiciones de la cláusula WHERE no participarán en la conexión, siempre y cuando especifiquemos en las condiciones de búsqueda de la cláusula WHERE que la columna de la tabla conducida no es NULL (esta condición se llama rechazo de valor nulo ), entonces esas conexiones externas son Los registros de la tabla de unidades que no coinciden con las condiciones de la cláusula ON en la tabla de unidades no aparecerán en el conjunto de resultados final. En este momento, la combinación externa y la combinación interna son los mismos, y el propósito de eliminar la unión exterior se logra.


dos. Optimización de subconsultas

(1) Subconsulta

1. Información general

       Una subconsulta es anidar una consulta en una declaración de consulta, ya sea en la cláusula FROM, cláusula WHERE, cláusula ON, etc., las subconsultas se pueden anidar y la consulta externa se llama consulta externa. La subconsulta colocada en la cláusula FROM se denomina tabla derivada, porque equivale a consultar una tabla.

2. Clasificación según el conjunto de resultados devuelto

(1) Consulta cuántica escalar

       Devuelve solo una subconsulta de un solo valor.

(2) Subconsulta de fila

       Una subconsulta que devuelve un registro que debe contener varias columnas.

(3) Consulta de Liezi

       Para consultar los datos de una columna, debe contener varios registros.

(4) Subconsulta de la tabla

       El resultado de la subconsulta contiene varios registros y varias columnas.


3. Clasificados según la relación con la consulta externa

(1) Subconsultas irrelevantes

       La subconsulta se ejecuta de forma independiente para producir los resultados y no depende del valor de la consulta externa.

(2) Subconsultas relacionadas

       La ejecución de la subconsulta depende del valor de la consulta externa.

4. El uso de subconsultas en expresiones booleanas

(1) Usar con operadores de comparación

(2) EN / NO EN
操作数 [NOT] IN (子查询)

       Si (no) existe en el conjunto que consiste en el conjunto de resultados de la consulta.

(3) CUALQUIERA / ALGUNOS
操作数 比较操作符 ANY/SOME(子查询)

       Siempre que haya un valor en el conjunto de resultados de la subconsulta, cuando un operando especificado se compara con el valor a través de un operador de comparación, el resultado es VERDADERO, entonces toda la expresión es VERDADERA.

(4) TODO
操作数 比较操作符 ALL(子查询)

       Solo cuando un operando especificado se compara con todos los valores en el conjunto de resultados de la subconsulta a través del operador de comparación, el resultado es VERDADERO, toda la expresión será VERDADERA.

(5) EXISTE
[NOT] EXISTS (子查询)

       Solo necesita juzgar si hay registros en el conjunto de resultados de la subconsulta y no le importa cuáles son los registros.

5. Precauciones para las subconsultas

       (1) La subconsulta debe usar paréntesis

       (2) La subconsulta en la cláusula SELECT debe ser una subconsulta escalar

       (3) No está permitido agregar, eliminar o modificar los registros de una tabla en una declaración y realizar una subconsulta en la tabla al mismo tiempo.


(Dos) como se ejecuta la subconsulta en MySQL

1. Subconsulta estándar, subconsulta de fila

(1) Subconsultas irrelevantes

       Ejecute la subconsulta por separado y luego use los resultados obtenidos por la subconsulta como los parámetros de la consulta externa, y luego ejecute la consulta externa, es decir, múltiples consultas de una sola tabla.

(2) Subconsultas relacionadas

       Primero obtenga un registro de la consulta externa, y luego busque el valor involucrado en la subconsulta de este registro para ejecutar la subconsulta, y finalmente verifique si la condición en la consulta externa se establece de acuerdo con el resultado de la consulta de la subconsulta, y si se establece, la consulta externa El registro de la consulta de capa se agrega al conjunto de resultados; de lo contrario, se descarta.

2. Optimización de subconsultas IN

(1) Tabla de materialización

       Para las subconsultas IN irrelevantes, si el conjunto de resultados de la subconsulta es demasiado grande, puede causar problemas de rendimiento. Si el almacenamiento interno no es suficiente, el índice no se puede utilizar de manera eficaz. Por lo tanto, el conjunto de resultados no se usa directamente como parámetro de la consulta externa, pero el conjunto de resultados se escribe en una tabla temporal y los registros escritos se deduplican para ahorrar espacio. La tabla temporal utiliza el motor de almacenamiento MEMORY basado en la memoria, y también se establece un índice hash para la tabla. Si el conjunto de resultados es particularmente grande, la tabla temporal se convertirá en un motor de almacenamiento basado en disco para guardar el conjunto de resultados, y el índice también se convertirá en índice B + Tree. Este proceso de creación de tablas temporales se denomina materialización y las tablas temporales se denominan tablas materializadas.

       Ahora que se genera una nueva tabla, puede realizar operaciones de combinación interna en la tabla materializada con otras tablas, y puede encontrar el método de ejecución de menor costo calculando el costo.

(2) Semi-conectado

       Las tablas materializadas tienen el costo de crear tablas temporales, MySQL propone semi-join, que convierte directamente las subconsultas en joins. La semi-unión de la tabla s1 y la tabla s2 significa que para los registros en la tabla s1, solo le importa si hay registros coincidentes en la tabla s2, y no le importa cuántos registros coincidan, el resultado final Solo el Los registros de la tabla s1 se mantienen en la colección.

       Hay 5 estrategias de ejecución de semiunión, y la semiunión es solo una estrategia de optimización dentro de MySQL, no una interfaz abierta a los usuarios.


3. Subconsulta [NO] EXISTE

       Si es una subconsulta irrelevante, primero ejecute la subconsulta y, si el resultado es VERDADERO o FALSO, vuelva a escribir la declaración de consulta original. Si es una subconsulta correlacionada, solo se puede consultar de la misma manera que la subconsulta correlacionada en la subconsulta estándar anterior, y la subconsulta EXISTS se puede capturar para acelerar el índice.

4. Optimización de tablas derivadas

       La subconsulta colocada en la cláusula FROM es la tabla derivada y MySQL proporciona dos estrategias de ejecución. Una es materializar la tabla derivada y escribirla en una tabla temporal, y tratar la tabla materializada como una tabla normal para participar en la consulta. También hay una estrategia de materialización retrasada en MySQL, que se materializará solo cuando la tabla derivada sea realmente utilizado en la consulta. Tabla derivada. Otra es fusionar la tabla derivada con la consulta externa, escribirla en un formulario sin una tabla derivada, extraer la tabla derivada en la cláusula FROM y fusionar las condiciones de búsqueda en la cláusula WHERE.

       MySQL primero intenta fusionar la tabla derivada con la consulta externa, si no funciona, materializa la tabla derivada y ejecuta la consulta.

Supongo que te gusta

Origin blog.csdn.net/Mrwxxxx/article/details/113839762
Recomendado
Clasificación