Lado de Tencent: ¿cómo suele solucionar problemas y ajustar SQL lento?

I. Introducción

En el último artículo, hablamos sobre el lado de Tencent : Hablemos sobre los principios subyacentes de los índices en MySQL. Creo que tiene una comprensión clara de los índices. En este artículo, hablaremos sobre la solución de problemas y el ajuste de SQL lento. La razón por la que el entrevistador hizo esta pregunta en realidad está relacionada con el principio subyacente de la indexación en el artículo anterior. Generalmente, una gran parte del SQL lento se debe a que no se sabe lo suficiente sobre el principio subyacente de la indexación, como la falta de indexación, la falla del índice, la indexación El incumplimiento del principio de coincidencia del prefijo más a la izquierda conduce a SQL lento. Una empresa con una gran cantidad de datos como Tencent debe tener un DBA especial para optimizarlo. El entrevistador examina principalmente su capacidad para solucionar problemas y conocer los principios subyacentes del índice. Y conocer la dirección de la optimización no le permitirá entrar y estropear las bases de datos de buen comportamiento de otras personas.

Vayamos directamente al siguiente tema: Primero, hablemos sobre cómo solucionar problemas de SQL lento.

2. Habilitar el registro de consultas lentas

Varias variables importantes del sistema relacionadas con SQL lento en MySQL son las siguientes:

parámetro significado
registro_consulta_lenta Ya sea para habilitar el registro de consultas lentas, ON está habilitado, OFF no está habilitado, el valor predeterminado es OFF. Activarlo afectará el rendimiento y el reinicio de MySQL fallará.
archivo_de_registro_de_consulta_lenta Especifica la ruta y el nombre del archivo de registro de consultas lentas. El nombre de archivo predeterminado es host_name-slow.log.
tiempo_de_consulta_largo El registro de consultas lentas se registra solo cuando el tiempo de ejecución supera este valor. La unidad es segundos y el valor predeterminado es 10.
registro_salida La ubicación de salida del registro, el valor predeterminado es ARCHIVO, es decir, se guarda como un archivo. Si se establece en TABLA, el registro se registrará en la tabla mysql.show_log y se pueden configurar varios formatos.

Ejecute la siguiente declaración para verificar si el registro de consultas lentas está habilitado, ON significa habilitado, OFF significa deshabilitado y el valor predeterminado es OFF.

SHOW VARIABLES LIKE '%slow_query_log%';
复制代码

inserte la descripción de la imagen aquí

Como puedes ver, ya lo he abierto aquí. Si el suyo no está habilitado, puede usar los siguientes dos métodos para habilitar la consulta lenta.

2.1 Modificar el archivo de configuración

Modifique el archivo de configuración vim /etc/my.cnfy agregue la siguiente configuración en la sección [mysqld]:

[mysqld] slow_query_log=1 slow_query_log_file=/var/lib/mysql/data/slow.log long_query_time=3 log_output=FILE,TABLE

需要重启 MySQL 才可以生效,命令为 service mysqld restart

2.2 设置全局变量

如下打开慢查询日志,设置超时时间为 3 秒,并且将日志记录到文件以及 mysql.show_log 表中。

SET GLOBAL slow_query_log = 1; SET GLOBAL slow_query_log_file='/var/lib/mysql/data/slow.log'; SET GLOBAL long_query_time=3; SET GLOBAL log_output='FILE,TABLE';

想要永久生效得用上面那个配置文件里配置,否则数据库重启后,这些配置失效。

三、分析慢查询日志

3.1 获取慢 SQL 信息

查看慢查询日志记录数:

SHOW GLOBAL STATUS LIKE '%Slow_queries%';
复制代码

inserte la descripción de la imagen aquí

模拟语句:

select sleep(5);
复制代码

查看日志:

cat /var/lib/mysql/data/slow.log
复制代码

inserte la descripción de la imagen aquí

3.2 mysqldumpslow

MySQL 内置了 mysqldumpslow 这个工具来帮我们分析慢查询日志。

inserte la descripción de la imagen aquí

#得到返回记录集最多的10个SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/data/slow.log
#得到访问次数最多的10个SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/data/slow.log
#得到按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "LEFT JOIN" /var/lib/mysql/data/slow.log
#结合| more使用,防止爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/data/slow.log | more

s:表示按何种方式排序
c:访问次数
l:锁定时间
r:返回记录
t:查询时间
al:平均锁定时间
ar:平均返回记录数
at:平均查询时间
t:返回前面多少条的数据
g:后边搭配一个正则匹配模式,大小写不敏感
复制代码

3.3 pt-query-digest

pt-query-digest 是一款很强大的慢查询日志分析工具,可以分析 MySQL 数据库的 binary log 、 general log 日志,同时也可以使用 show processlist 或从 tcpdump 抓取的 MySQL 协议数据来进行分析。

这里老周不带大家搭建以及使用了哈,想进一步了解的可以看这份文档:pt-query-digest

四、Explain 执行计划分析慢 SQL

上一篇我们非常详细的去介绍了,一文读懂 MySQL Explain 执行计划

五、Show Profile 分析慢 SQL

Show Profile 也可以分析慢 SQL,比 explain 获取的信息更详细,比如能分析当前会话中语句执行的资源消耗情况,能分析这条 SQL 整个生命周期的耗时。但没有上面 pt-query-digest 那款慢查询日志分析工具强大,但 pt-query-digest 是外置的需要单独下载,如果你想用内置的话,能够满足你的需求的话,选择 Show Profile 就行。

5.1 如何开启

默认关闭。开启后,会在后台保存最近 15 次的运行结果,然后通过 Show Profile 命令查看结果。

-- 开启
SET profiling = ON;
-- 查看
SHOW VARIABLES LIKE 'profiling%';
复制代码

inserte la descripción de la imagen aquí

5.2 SHOW profiles 查看 SQL 的耗时

inserte la descripción de la imagen aquí

5.3 SQL 整个生命周期的耗时

通过 Query_ID 可以得到具体 SQL 从连接——服务——引擎——存储四层结构完整生命周期的耗时

SHOW profile CPU, BLOCK IO FOR QUERY 4;
复制代码

inserte la descripción de la imagen aquí

可用参数 type:

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

5.4 危险状态

SHOW profile CPU, BLOCK IO FOR QUERY 2;
复制代码

GROUP BY 可能创建了临时表

inserte la descripción de la imagen aquí

危险状态:

converting HEAP to MyISAM # 查询结果太大,内存不够用了,在往磁盘上搬。

Creating tmp table # 创建了临时表,回先把数据拷贝到临时表,用完后再删除临时表。

Copying to tmp table on disk # 把内存中临时表复制到磁盘

locked # 记录被锁了

看到这些危险状态可以进行相应的调优,然后我们线上也会针对慢 SQL 进行监控,存在慢 SQL 的话会触发告警机制,通知相应的人员快速定位慢 SQL 并优化。

Supongo que te gusta

Origin juejin.im/post/7085344995120513055
Recomendado
Clasificación