说在前面:
查询优化、索引优化、库表结构优化是查询性能优化的三驾马车。
完成一个完整的查询生命周期,查询需要在不同阶段花费时间,如网络、CPU计算、生成统计信息、执行计划、锁互斥等待,底层存储引擎调用,需要在内存操作,CPU操作和内存不足导致I/O操作上时间消耗。
1. 请求多余的数据
查询数据超过实际程序需数据,冗余数据被程序丢弃。这会对MYSQL服务器带来额外的负担,增大网络开销,同时会消耗应用服务器的CPU 及内存资源。
- 查询不需要记录
LIMIT 解决查询无用的数据
- 多表关联返回全部列
仅获取需要的列
- 取出全部列
错误示例:SELECT * FORM … …
如有缓存或提高代码复用性,上面示例也可考虑
- 重复查询相同数据
2. 扫描额外的记录
衡量查询最简单三个指标:响应时间、扫面行数、返回行数。
- 响应时间
响应时间即:服务时间(指数据库处理这个查询真正花费的时间)和排队时间(服务器等待某些资源而没有真正执行查询的时间–可能是等I/O操作完成,或等待行锁等等)。
- 扫面的行数和返回行数
- 扫面的行数和访问类型
EXPLAIN访问类型:全表扫面到索引扫面、范围扫描、唯一索引扫描、常数引用等。以上列举是速度从慢到快,扫描行数从多到少。
查询中无合适访问类型,最好办法是增加一个合适的索引。
WHERE条件拓扑
- 索引使用WHERE,是在存储引擎层完成。
- 索引覆盖扫描(Extra:Using where),直接从索引中过滤记录,是在MYSQL服务层完成,但无需查询表记录。
- 数据表返回结果,服务层完成。MySQL需先从数据表读取记录然后过滤。