Razones para SQL lento

Operación de lectura lenta

En la mayoría de los proyectos, hay más operaciones de lectura en la base de datos que operaciones de escritura, así que primero hablemos de las razones de las operaciones de lectura lentas.
Cómo localizar SQL lento
Hay un registro de consultas lento en MySQL , que está cerrado de forma predeterminada y debe abrirse manualmente.
1. Consultar si el registro lento está habilitado

mysql> show variables like '%slow_query_log%';

APAGADO está cerrado ENCENDIDO está abierto
2. Abra el registro de consultas lento

mysql> set global slow_query_log='ON';

Este método solo es efectivo para la base de datos actual y dejará de ser válido después de que MySQL se reinicie. Si desea que surta efecto de forma permanente, debe modificar el archivo de configuración my.cnf
3. Abra permanentemente el registro de consultas lentas
my.cnf para encontrar [mysqld], agregue el siguiente código debajo

slow_query_log=ON
slow_query_log_file=/usr/local/mysql/var/localhost-slow.log
long_query_time=5
log-queries-not-using-indexes = 1

Después de la configuración, es necesario reiniciar el servicio mysql.
Descripción del parámetro relacionado
1.slow_query_log
Este elemento de configuración determina si se habilita la función de consulta de registro lento, y el valor configurado es ON u OFF.
2.slow_query_log_file
Este elemento de configuración es la consulta de registro lento archivo de registro y debe crearse manualmente
3. Long_query_time
Este elemento de configuración es para establecer el umbral de tiempo para la consulta de registro lento. Cuando se excede este umbral, el registro lento se registrará. El valor configurado es 0 (se registran todas las declaraciones SQL) , o> 0 (umbral específico)). El elemento de configuración está en segundos, y puede establecerse en un decimal
4.log-queries-not-using-indexes
Este elemento de configuración es para registrar
la razón por la cual la operación de lectura del SQL La declaración que no se usa para el índice es lenta
1. Los índices perdidos
pueden analizar el plan de ejecución del SQL actual agregando una explicación antes del SQL ejecutado.
Inserte la descripción de la imagen aquí
1.tipo

Representa la forma en que MySQL encuentra la fila requerida en la tabla. Los tipos más utilizados son: ALL, index, range, ref, eq_ref, const, system, NULL, estos tipos de izquierda a derecha, el rendimiento mejoró gradualmente.

TODO: Mysql recorre toda la tabla para encontrar filas coincidentes;

índice: la diferencia con TODOS es que el tipo de índice solo atraviesa el árbol de índice;

rango: solo recupera filas en un rango dado y usa un índice para seleccionar filas;

ref: indica las condiciones de coincidencia de conexión de la tabla anterior, qué columnas o constantes se utilizan para encontrar el valor en la columna de índice;

eq_ref: similar a ref, la diferencia es si es un índice único. Para cada valor de clave de índice, solo hay un registro en la tabla que coincide. En pocas palabras, la clave principal o clave única se utiliza como condición de asociación en la conexión de varias tablas;

const, system: cuando Mysql optimiza una determinada parte de la consulta y la convierte en una constante, utilice estos tipos de acceso. Si coloca la clave principal en la lista where, Mysql puede convertir la consulta en una constante, system es un caso especial de tipo const, cuando la tabla de consulta tiene solo una fila, use system;

NULL: Mysql descompone la declaración durante el proceso de optimización y ni siquiera necesita acceder a la tabla o al índice durante la ejecución. Por ejemplo, la selección del valor mínimo de una columna de índice se puede realizar mediante una búsqueda de índice separada.

2.posibles_claves

El índice que se puede usar en la consulta (pero no necesariamente se usará, se mostrará como NULL si no hay índice).

3.clave

El índice realmente utilizado.

4 filas

Estime la cantidad de filas necesarias para encontrar el registro correspondiente.

5.Extra

Los más comunes son los siguientes:

Usando índice: indica que se usa el índice de cobertura y no es necesario volver a la tabla;

Usando donde: Sin leer toda la información en la tabla, los datos requeridos se pueden obtener solo a través del índice. Esto sucede cuando todas las columnas solicitadas de la tabla son parte del mismo índice, lo que significa que el servidor mysql recuperará filas en el motor de almacenamiento Filtro después;

Usar temporal: indica que MySQL necesita usar una tabla temporal para almacenar el conjunto de resultados, que es común en la clasificación y agrupación de consultas, agrupación común por, ordenación por;

Uso de ordenación de archivos: cuando la consulta contiene un orden por operación y la operación de ordenación que no se puede completar con el índice se denomina "ordenación de archivos".

2. Problema de página sucia Cuando la
página de datos de la memoria no coincide con la página de datos del disco, la página de datos de la memoria se denomina página sucia.
Para evitar aumentar la sobrecarga de E / S al acceder al disco cada vez que lee y escribe datos, el motor de almacenamiento Innodb mejora la velocidad de lectura y escritura al cargar las páginas de datos correspondientes y las páginas de índice en el grupo de búfer de la memoria. Luego, de acuerdo con el principio de uso menos reciente para retener los datos almacenados en caché en el grupo de búferes. Cuando la página de datos que se va a leer no está en la memoria, debe solicitar una página de datos en el grupo de búfer, pero la página de datos en el grupo de búfer es segura. Cuando la página de datos alcanza el límite superior, debe guardar el datos no utilizados más largos La página se elimina de la memoria. Pero si se eliminan las páginas sucias, las páginas sucias deben vaciarse en el disco para su reutilización.
Para la situación de tirar las páginas sucias, debemos controlar la proporción de páginas sucias y no dejar que se acerque al 75%. Al mismo tiempo, también debe controlar la velocidad de escritura en disco del registro de rehacer, e indicarle a InnoDB la capacidad de su disco configurando el parámetro innodb_io_capacity.

Operación de escritura lenta

1. Limpiar páginas sucias
Durante la operación de escritura, el motor de almacenamiento (Innodb) escribirá el registro en el registro de rehacer (registro físico de almacenamiento) y actualizará la caché, de modo que se complete la operación de actualización. El motor de almacenamiento de operaciones subsiguientes sincronizará el registro de operaciones con el disco cuando sea apropiado. El proceso de escritura del registro de rehacer se escribe en el disco secuencialmente. La escritura secuencial del disco reduce el tiempo de búsqueda, etc., y la velocidad es mucho más rápida que la escritura aleatoria (similar al principio de almacenamiento de Kafka), por lo que la velocidad de escritura del registro de rehacer es muy rápido. En un escenario de alta concurrencia, el registro de rehacer se llena rápidamente, pero los datos son demasiado tarde para sincronizarse con el disco. En este momento, se generarán páginas sucias y las operaciones de escritura posteriores se bloquearán. La ejecución de SQL naturalmente se ralentizará abajo.

2. Bloquear
Mysql, cuando la fila que va a cambiar por un determinado SQL está bloqueada, las operaciones posteriores solo se pueden realizar después de que se libere el bloqueo.
Ver la situación actual de bloqueo:

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

Si la transacción espera demasiado o se produce un interbloqueo, el bloqueo actual se puede liberar mediante "kill thread ID (trx_mysql_thread_id)".

Supongo que te gusta

Origin blog.csdn.net/weixin_43278644/article/details/112697819
Recomendado
Clasificación