性能调优
如何看一个SQL语句是否走了索引?
- 可以通过explatin来查看这条SQL语句的执行计划,主要字段包括TYPE(扫描类型)、POSSIBLE_KEYS(可能的索引)、KEY(实际索引)、KEY_LEN(索引长度)、ROWS(扫描的数据行)
-
主要看TYPE 当前的扫描类型:
- ALL 全表扫描
- INDEX 全索引扫描
- RANGE 范围索引扫描
- REF 非唯一索引扫描
- EQ_REF 唯一索引扫描
- CONST 主键索引或者唯一索引扫描
EXTRA 字段
- USING INDEX 覆盖索引
- USING WHERE 将查询结果返回到service进行过滤,USING WHERE 不一定回表
- USING INDEX CONDITION 在索引层进行数据过滤,不用取出数据再返回service层了
怎么找到慢SQL
再SQL的配置文件中设置为3s
slow_query_log = 3
slow_query_log_file = /path/to/slow_query.log
long_query_time = 3
如何优化慢SQL
- 优化数据访问,是否有不必要的列(不用*),是否查询的列太多,加limit
- 切分查询,把大查询分段查询,每次只查一小部分,最后组合
- 分解联表查询
- 覆盖索引,并检查是否会出现索引失效,排序优化
如果SQL语句都没问题,怎么优化?
- 短平快的数据走REDIS旁路缓存
- 分批查询
- 分段查询
- 读多写少的用主从复制
- 合理分库
深分页查询如何优化?
-
深分页场景:SELECT ..... LIMIT 1000000 20
- 这种场景,从100万开始查,但返回20条,时间复杂度高,如果回表,前一百万条也要进行回表
-
场景优化
- 记录上一次最后的id WHERE ID>xl来查询
- 覆盖索引+子查询,先查询出来二级索引需要的主键值,然后用主键值去查主键索引