为什么会出现慢SQL?
- 未用索引,就会造成全表扫描;又或者索引失效了
- 单表数据量太大,导致加了索引也无济于事
- 子查询过多(大量join会导致笛卡尔积后再筛选,所以大量join会导致大量运算使得sql变慢)
怎么进行慢SQL分析
- 启用慢查询日志,设置阈值,找到慢SQL
- 执行explain sql, 分析sql执行计划,重点关注:
type
(ALL(全表扫描)、index(索引全扫描)),key
(实际使用的索引)、key_len
(索引长度)、rows
(估计为了找到所需的行而必须检查的行数。)
如何优化
索引方面
- 遵循最左前缀匹配原则
- 尽量选择区分度高的列作为索引
- 索引列不能参与计算
优化数据访问
- 只返回必要的列:最好不要使用 SELECT * 语句
- 只返回必要的行:使用 LIMIT 语句来限制返回的数据