Solución de consulta lenta MySQL

Reimprima el siguiente artículo

MySQL abre el registro de consultas lento
MySQL Explica el ciclo de vida de ejecución de SQL de la vista de perfil de la demostración detallada

Uno, inicie el registro de consultas lento

Activar el registro lento solo es adecuado para proyectos pequeños, proyectos que no están en línea o situaciones de emergencia, porque una vez que se activa la consulta de registro lento, aumentará la presión sobre la base de datos. Por lo tanto, el fondo se usa generalmente para escribir el tiempo de operación de datos en el archivo de registro, y el registro se borra regularmente cada semana.

Descripción de parámetros:

slow_query_log 慢查询开启状态,ON开启,OFF关闭
slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
long_query_time 查询超过多少秒才记录

Compruebe si se ha activado la consulta lenta

show variables like 'slow_query%';

resultado de la operación:

Inserte la descripción de la imagen aquí

show variables like 'long_query_time';

Resultado de la operación: la
Inserte la descripción de la imagen aquí
consulta predeterminada es más de 10 segundos antes de la grabación

Habilitar consulta lenta

1. Configuración de variables globales (el reinicio de la base de datos de esta manera fallará y deberá reconfigurarse)

# 将 slow_query_log 全局变量设置为“ON”状态
set global slow_query_log='ON'; 
# 设置慢查询日志存放的位置
set global slow_query_log_file='/usr/local/mysql/data/slow.log'; 
# 设置查询超过1秒就记录(如果有时候用命令不起作用,那么可以关闭再打开)
set global long_query_time=1;

2. Modifique el archivo de configuración my.cnf (el reinicio del servidor no afectará)

Modifique el archivo de configuración my.cnf y agréguelo en [mysqld]

slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log     //linux
long_query_time = 1

Reinicie el servicio MySQL

service mysqld restart

En segundo lugar, analice sql de consulta lenta

explicar Ver un plan de ejecución de estas sentencias SQL, verificar si la sentencia SQL usa un índice y si se realiza un escaneo completo de la tabla

explain select * from emp where name = 'Jefabc';

resultado de la operación:
Inserte la descripción de la imagen aquí

identificación Seleccionar identificador
seleccione tipo Indica el tipo de consulta.
mesa Tabla de conjunto de resultados de salida
particiones Partición a juego
escribe Indica el tipo de conexión de la mesa.
llaves_posibles Indica el índice que se puede utilizar al realizar consultas.
llave Indica el índice real utilizado
key_len Longitud del campo de índice
árbitro Comparación de columnas e índices
filas Número de filas escaneadas (número estimado de filas)
filtrado Porcentaje de filas filtradas por criterios de tabla
Extra Descripción y explicación de la implementación

El tipo de consulta select_type es consulta de tabla única, consulta de unión, subconsulta, etc.

SENCILLO SELECT simple, sin usar UNION o subconsultas, etc.
PRIMARIO La consulta más externa en la subconsulta. Si la consulta contiene subpartes complejas, la selección más externa se marca como PRIMARY
UNIÓN La segunda instrucción SELECT o la siguiente en UNION
UNIÓN DEPENDIENTE La segunda declaración SELECT o la siguiente en UNION depende de la consulta externa
RESULTADO DE LA UNIÓN El resultado de UNION, la segunda selección en la declaración de unión inicia todas las selecciones
SUBQUERY El primer SELECT en la subconsulta, el resultado no depende de la consulta externa
SUBQUERY DEPENDIENTE El primer SELECT en la subconsulta depende de la consulta externa
DERIVADO Subconsultas en cláusulas SELECT y FROM de tablas derivadas
SUBQUERY INCUPERABLE El resultado de una subconsulta no se puede almacenar en caché, la primera línea del enlace externo debe volver a evaluarse

escriba acceso a la mesa

Ordenar de mejor a peor: sistema> const> eq_ref> ref> ref_or_null> index_merge> unique_subquery> index_subquery> range> index> all.

TODOS Recorra toda la tabla para encontrar filas coincidentes
índice Atravesar el árbol de índice
abarcar Recupere solo filas en un rango dado, use un índice para seleccionar filas
árbitro Indica la condición de coincidencia de conexión de la tabla anterior, es decir, qué columnas o constantes se utilizan para encontrar el valor en la columna de índice
eq_ref Similar a la referencia, la diferencia es que el índice utilizado es la clave primaria del índice único o único.
sistema const 、 Cuando MySQL optimiza una determinada parte de la consulta y la convierte en una constante, utilice estos tipos de acceso. Si la clave principal se coloca en la lista where, MySQL puede convertir la consulta en una constante. System es un caso especial del tipo const. Cuando la tabla de consultas tiene solo una fila, use system
NULO 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 hacer mediante una búsqueda de índice separada.

possible_keys índices posibles

Indique qué índice puede usar MySQL para buscar registros en la tabla. Si hay un índice en el campo involucrado en la consulta, el índice aparecerá en la lista, pero es posible que la consulta no lo use).

Índice de clave realmente utilizado

La columna de clave muestra la clave (índice) que MySQL realmente decide usar, que debe incluirse en possible_keys

Si no se selecciona ningún índice, la clave es NULL. Para forzar a MySQL a usar o ignorar el índice en la columna possible_keys, use FORCE INDEX, USE INDEX o IGNORE INDEX en la consulta.

Tres, mostrar perfil para análisis SQL

1. ¿Qué es Mostrar perfil?

Es un método de ajuste de SQL proporcionado por mysql para analizar el consumo de recursos de la ejecución de SQL en la sesión actual, y es más granular que explicar. El estado cerrado predeterminado y guarde los resultados de las últimas 15 ejecuciones.

2. Compruebe si el parámetro está activado y cómo activarlo.

1. Comprueba si está encendido

show  VARIABLES like 'profiling';

Resultado de la operación:
Inserte la descripción de la imagen aquí
2. Perfil abierto, que está cerrado por defecto, ahora abierto.

set profiling = 1;

3. Usar perfil

1. SQL lento durante la ejecución

select * from emp group by id%10;
select * from emp group by id%20 order by 5;

2. Ejecute sql

show profiles;

resultado de la operación:
Inserte la descripción de la imagen aquí

3. Diagnostique SQL y vea el uso de CUP, formato: muestre el perfil de la CPU, bloquee io para la consulta [Query_ID]

show profile cpu,block io for query 12

Resultados de la ejecución
Inserte la descripción de la imagen aquí
Aquí solo se enumeran cpu y block io. Por supuesto, los tipos de diagnóstico son más que estos, el cpu y block io de uso común

ALL 显示所有的开销信息
BLOCK IO 显示块IO相关开销
CONTEXT SWITCHES 上下文切换相关开销
CPU  显示CPU相关开销信息
IPC  显示发送和接收相关开销信息
MEMORY 显示内存相关开销信息
PAGE FAULTS 显示页面错误相关开销
SOURCE  显示和Source_function,Source_file,Source_line相关的开销信息
SWAPS   显示交换次数相关开销的信息

Las siguientes 4 ocurrencias de Status causarán grandes problemas:

converting HEAP to MyISAM :查询结果太大,内存都不够用了往磁盘上搬
Creating tmp table : 创建临时表,拷贝数据到临时表,用完再删除
Copy to tmp table on disk : 把内存中临时表赋值到磁盘,很危险
locked   :存在锁

De la siguiente manera:
Inserte la descripción de la imagen aquí
crear una tabla tmp, copiar a la tabla tmp, eliminar la tabla tmp, por supuesto, será lento

Cuarto, optimización de sql

Optimización de sentencias SQL

Supongo que te gusta

Origin blog.csdn.net/fangye1/article/details/114087488
Recomendado
Clasificación