高频的面试题,最近面试也着了道,所以整理了一下
慢查询
慢查询一般是指查询效率低下的查询SQL语句,不满足生产所需的要求,产生原因:
- 根本原因查询数据量过大
- 没有加索引,或者索引未生效
- SQL语句不够优化
如何排查
1.服务监控
一般发现慢查询是通过服务监控查看到接口平均RT过大,达到秒级,如果服务接口没有跨服务调用或复杂逻辑,可以先排查SQL问题
2.慢查询日志
如果Mysql开启了慢查询日志,可优先去分析慢查询日志结果 MySQL的慢查询日志记录了在数据库中运行时间超过设定阈值(默认为10秒)的所有查询语句。通过分析这些慢查询可以发现性能低下或者需要进行优化的地方。以下是如何开启慢查询的配置
# 默认不启用,需手动开启
slow_query_log = 1
# 慢查询日志的存储位置
slow_query_log_file = /var/log/mysql/mysql-slow.log
# 没使用索引的查询
log_queries_not_using_indexes = 1
# 慢查询默认阈值 10秒 可根据实际业务需要调低成1~2秒
long_query_time = 10
explain执行计划
确定了是SQL慢查询的问题,那就去分析一下到底什么原因导致SQL执行缓慢 通常我们使用explain去分析执行计划,explain主要关注一下几个字段:
- type:表示MySQL在表中找到所需行的方式,或者叫访问类型
-
- type=ALL,全表扫描,MySQL遍历全表来找到匹配行
- type=index,索引全扫描
- type=range,索引范围扫描
- type=eq_ref,唯一索引
- type=NULL,MySQL不用访问表或者索引,直接就能够得到结果(性能最好)
- possible_keys: 表示查询可能使用的索引
- key: 实际使用的索引
- key_len: 使用索引字段的长度
- rows: 扫描行的数量
- Extra:
-
- using index:覆盖索引,不回表
- using where:回表查询
- using filesort:需要额外的排序,不能通过索引得到排序结果
其他原因
如果排查到SQL索引命中,数据量也不大没什么优化空间,可以排查下是否是以下原因(一般是偶然情况出现):
- 数据库在刷新脏页,例如 redo log 写满了需要同步到磁盘
- 执行的时候,遇到锁,如表锁、行锁
- 项目并发较多,应用程序或数据库连接不够