慢查询原因
1 从数据库请求不需要的数据
- 例如业务只需要返回指定的列,sql查询全部列,或者多表关联返回全部列。
- 某些相同数据被重查询多次,可以结合实际业务在初次查询后进行缓存,需要时候从缓存中取出
2 扫描额外的记录行
2 解决方法
1 扫描行数过多
如果发现查询需要扫描大量的数据但是只返回少量的行,那么可以尝试如下优化:
- 使用索引覆盖扫描
- 改变库表结构,例如使用单独的汇总表
- 重写这个复杂查询也即重构该查询,让MySQL以更优化方式执行查询
2 重构查询方式
主要提供几种优化数据库查询的思路,具体的改进还要结合业务进行定制化优化:
- 一个复杂查询还是多个简单查询
网络通信、查询解析和优化的代价不是很高,所以有时候将一个大查询分解为多个小查询很有必要。实际中可以根据业务对实际两种查询的sql进行比对、衡量
- 切分查询
例如定期删除大量数据时,如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。所以可以通过将大的DELETE语句切分成多个较小的查询提高MySQL性能。
- 分解关联查询
分解关联查询是指对每一个表进行一次单表查询,然后将结果在应用程序中进行关联。这样做的好处:
- 让缓存的效率更高,对于mysql来说,如果某个表很少发生变化,那么基于该表的查询就可以重复利用缓存结果
- 查询分解后,单个查询可以减少锁的竞争
- 在应用层做数据的关联,容易对数据库进行拆分,提高扩展性
- 减少冗余记录的查询