El parámetro del optimizador de MySQL derivado_merge conduce al rendimiento de la asociación de múltiples tablas SQL y su baja

    Recientemente, durante el mantenimiento de MySQL, encontré un problema: la velocidad de ejecución de la instrucción SQL en el entorno de prueba de MySQL 5.6 es de menos de 1 segundo, pero la velocidad de ejecución es de menos de 1 segundo en el entorno de prueba de MySQL 5.6.

Se tarda casi 5 minutos en ejecutar mysql 5.7 en un entorno de producción La misma base de datos en mysql 5.7 tiene la misma cantidad de datos y se ejecuta después de actualizar las estadísticas de la tabla.

La velocidad sigue siendo de 2 minutos. El procesamiento de este problema no tiene nada que ver con la declaración sql en sí, solo está relacionada con los parámetros del optimizador de la base de datos mysql, lo siguiente es

Durante el proceso de análisis y resolución de problemas, no es necesario mostrar la declaración SQL en el análisis del problema. Puede quedar claro que SQL es una conexión de combinación de varias tablas y no se permite cambiar el negocio.

    1. Primero, verifique el plan de ejecución de la declaración sql de mysql en el entorno de prueba y el entorno de producción.

- Entorno de prueba, el plan de ejecución solo necesita mostrar la parte que puede explicar el problema

- En el entorno de producción, el plan de ejecución solo necesita mostrar la parte que puede explicar el problema.

    2. De la comparación de declaraciones SQL en los entornos de prueba y producción, es obvio que el plan de ejecución de SQL es inconsistente y se encuentra en la investigación de seguimiento.

a. La información estadística de las tablas e índices involucrados en SQL en el entorno de prueba es la más reciente de ese día, mientras que la información estadística de las tablas e índices relacionados en el entorno de producción es relativamente antigua.

b. La versión principal de mysql en el entorno de prueba es 5.6 y la versión principal de mysql en el entorno de producción es 5.7

    3, resolución de problemas

a. Debido a que el plan de ejecución de SQL es inconsistente y la información estadística del entorno de producción es relativamente antigua, vuelva a recopilar la información estadística de la tabla del entorno de producción, la velocidad de ejecución de SQL después de la recopilación no es

Mejorar, en comparación con la prueba, sigue siendo muy lento.

b. Preste atención al plan de ejecución del entorno de prueba derivado y <auto_key>, esta característica está relacionada con el parámetro de mysql derivado_merge, y verifique la configuración de este parámetro.

--entorno de prueba

MySQL [(ninguno)]> muestra variables globales como '% switch%';

+ ------------------ + ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------- +

| Variable_name | Valor |

+ ------------------ + ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------- +

| optimizer_switch | index_merge = activado, index_merge_union = activado, index_merge_sort_union = activado, index_merge_intersection = activado, ....... |

+ ------------------ + ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------- +

1 fila en conjunto (0,00 seg)

MySQL [(ninguno)]> 

- En el entorno de producción, para facilitar la explicación del problema, se omite la visualización de parámetros redundantes.

mysql> muestra variables como '% switch%';

+ ------------------ + ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------- +

| Variable_name | Valor |

+ ------------------ + ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------- +

| optimizer_switch | ......, derivado_merge = en |

+ ------------------ + ------------------------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------------- +

1 fila en conjunto (0,00 seg)

mysql>

c. De acuerdo con las instrucciones oficiales, el parámetro derivado_merge se introdujo en la versión mysql5.7, y su función es unir (seleccionar) combinaciones y combinaciones de tablas. Esta pregunta SQL tiene

Un gran número de uniones (selecciones) dan como resultado la fusión de los resultados de ejecución de SQL y la velocidad de ejecución de SQL es extremadamente lenta.

d. Cancele temporalmente este parámetro a través del nivel de sesión, observe el plan de ejecución de SQL y descubra que el plan de ejecución de SQL es normal y que la velocidad de ejecución de SQL es menos de 1 segundo similar al entorno de prueba

--Cancelar el parámetro derivado_merge del optimizador

mysql>  set optimizer_switch = "derivado_merge = off";

ERROR 2006 (HY000): el servidor MySQL ha desaparecido

Sin conexión. Intentando volver a conectar ...

Id de conexión: 8980

Base de datos actual: mysql

Consulta OK, 0 filas afectadas (0.02 seg)

mysql> 

-Observe el problema del plan de ejecución de SQL, en este momento el plan de ejecución del entorno de producción es el mismo que el del entorno de prueba

- La velocidad de ejecución del problema de SQL ha cambiado de casi 5 minutos a aproximadamente 1 segundo ahora

 

Supongo que te gusta

Origin blog.csdn.net/www_xue_xi/article/details/90710102
Recomendado
Clasificación