定位慢查询
在MySQL应用中,慢查询 通常指的是执行时间超过一定阈值的查询语句。这个阈值通常由管理员或开发人员根据具体情况设置,一般是以毫秒为单位。慢查询可能会影响系统性能和用户体验,因此需要及时识别和优化。
表象: 页面加载过慢、接口压测响应时间过长(超过1s)
以下情景可能会导致慢查询:
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
定位慢查询的方法
方案一:工具
调试工具:Arthas;
运维工具:Prometheus、Skywalking;
方案二:MySQL自带慢日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
# 开启MySQL慢日志查询开关,值为0表示不开启慢日志查询
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2
配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/localhost-slow.log,如图:

注意:使用慢日志会损失一部分性能,因此一般是在调试阶段开启慢日志的功能,在生产环境下关闭。
SQL执行计划
可以采用EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,语法:
# 直接在select语句前加上关键字explain/desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;

- possible_keys 当前sql可能会使用到的索引
- key 当前sql实际命中的索引
- key_len 索引占用的大小(ps:可以通过key和key_len查看是否可能会命中索引。)
- Extra 额外的优化建议,比如某个索引在使用的过程中是否使用了回表,下图中展示了两个参考信息:

- type 这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、 index、all
- system:表示当前语句查询的表是MySQL系统中内置的表,(不常用);
- const:根据主键查询,(使用频率高);
- eq_ref:主键索引查询或唯一索引查询,只能返回一条数据;
- ref:索引查询,查询结果可能是多条数据;
- range:范围查询,(应用中的最低要求);
- index:索引树扫描;
- all:全盘扫描;
- 若type的值是index或all,则说明此条S

909

被折叠的 条评论
为什么被折叠?



