查询速度慢的原因
- 生命周期太长:从客户端到服务端,然后在服务端进行解析、生成执行计划、执行(包括数据的分组聚合处理等)、并返回结果
- 资源消耗:网络资源、CPU资源、锁等待、IO资源
- 访问的数据太多,大多数是行数据,也包括列数据
- 是否向数据库请求了不需要的数据
- 查询不需要的数据,比如
LIMIT 1000000,10
- 是否返回了全部列,比如
select * from
- 重复查询相同的数据,可以使用缓存解决
- 查询不需要的数据,比如
- MySQL是否在扫描额外的记录,可以使用
explain
分析,关注以下三个指标- 响应时间
- 服务时间:数据库处理这个查询实际消耗的时间
- 排队时间:等待时间,比如IO操作、锁等待等
- 扫描的行数
- 通过
explain
中的type
列获取访问类型(全表扫描、范围扫描、唯一索引查询、常数引用等) - 使用where条件的方式
- 在索引中使用where过滤数据,存储引擎层完成
- 索引覆盖扫描(Extra中出现Using index),服务层直接在索引中处理,不需要回表
- 冲数据表中返回数据(Extra中出现Using index),服务层完成(先从数据库中获取数据,然后在过滤数据)
- 通过
- 返回的行数
- 优化技巧(扫描比返回的数据多)
- 使用索引覆盖扫描
- 修改表结构
- 重新SQL
- 优化技巧(扫描比返回的数据多)
- 响应时间
- 是否向数据库请求了不需要的数据