【实现】mysql查询优化
1.查询性能低下最基本的原因是访问的数据太多。访问了太多的行,有时候也可能是访问了太多的列。
2.请求超过实际需要的数据:1.查询不需要的记录 limit杜绝2.多表关联时返回全部列 3.总是取出全部列 无法完成索引覆盖这类优化,但并不总是坏事
3.重复查询相同的数据,注意缓存
响应时间:服务时间+排队时间(等待I/O,锁等)
扫描的行数:
1.并不完美的指标:不是所有的行的访问代价都是相同的,比如 较短的行的访问速度更快,内存中的行也比磁盘中的行的访问速度要快得多
2.访问类型:在explain语句中的type列反应了访问类型。访问类型有很多种,从全表扫描到索引扫描,范围扫描,唯一索引查询,常数引用等。速度从慢到快,扫描行数从小到大。
一般mysql能够使用如下三种方式应用where条件,从好到坏依次为:
1.在索引中使用where条件来过滤不匹配的记录,这是在存储引擎层完成的。using where ,using index
2.使用索引覆盖扫描(在Extra列中出现了Using index)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在mySql服务器层完成的,但无须再回表查询记录
3.从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现Using where)。这在mysql服务器层完成,mysql需要先从数据表读出记录然后过滤。
3.返回的行数
切分查询(分页)
如果用一个大的语句一次性完成的话,则可能需要一次锁住很多数据沾满整个事务日志,耗尽系统资源,阻塞很多小的但重要的查询。
分解关键查询的优势:
1.让缓存的效率更高。应用程序的缓存,且对mysql的查询缓存来说,如果关联表中某个表发生了变化,那么就无法使用查询缓存了,而拆分后,如果某个表很少改变,那么基于该表的查询就可以重复利用查询缓存结果了。
2.将查询分解后,执行单个查询可以减少锁的竞争。
3.在应用层做关联,更容易对数据库进行拆分,更ring一座岛高性能和可扩展。
4.查询本身效率可能会有所提升,
5.可以减少冗余记录的查询。在应用层做关联查询,意味着对于某条记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。从这点看,这样的重构还可能会减少网络和内存的消耗。
6.这样做相当于在应用中实现了哈希关联,而不是使用MySql的嵌套循环关联。某些场景哈希关联的效率要高很多。