优化数据访问
1、是否向数据库请求了不需要的数据
给mysql服务器带来额外的负担,并增加网络开销、消耗应用服务器的cpu和内存资源
1、查询不需要的记录
select * ....
2、查询相同的数据
反复查询这个数据时,可以将这个数据缓存起来,需要的时候从缓存中取
2、Mysql 是否在扫描额外的记录
三个指标
1、响应时间
2、扫描的行数
3、返回的行数
···
响应时间:服务时间和排队时间。服务时间是指数据库处理这个查询真正花了多长时间,排队时间是指服务器因为等待某些资源而没有真正执行查询的时间(可能行级锁)。
···
如果查询发现扫描大量的数据但只返回少数的行:
1、使用索引覆盖扫描,把所有需要用的列都放在索引中,这样存储引擎无须回表获取对应行就可以返回结果。
2、改变库表结构。例如使用单独的汇总表。
3、重写这个复杂的查询,让Mysql优化器能够以更优的方式执行这个查询。
重构查询的方式
有优化的问题时,目标是应该找到更优的方式获得实际需要的结果(而不一定需要从Mysql获取一模一样的结果集)
1、将查询转换一种写法让其返回一样的结果
2、修改应用代码,用另一种方式完成查询
1、一个复杂的查询还是多个简单的查询
设计查询的时候一个需要考虑的重要问题,是否需要将一个复杂的查询分为多个简单的查询。 在传统的实现中,重视强调数据库层尽可能多的工作,这样做的逻辑在于以前总是认为网络通信、查询解析和优化是一件代价很高的问题。mysql从设计上连接和断开是很轻量级的在返回一个小的查询结果方面很高效。
2、切分查询
对于一个大查询 ' 分而治之 ',将大查询切分为小查询。
删除旧的数据(定期地清除大量数据时,可以分批次删除)
3、分解关联查询
很多高性能的应用都会对关联查询进行分解
分解的优势
1、让缓存的效率更高。拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
2、将查询分解后,执行单个查询可以减少锁的竞争
3、在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展性
4、查询本身效率也会提升
5、可以减少冗余记录的查询
6、哈希关联
网友评论