MySql查询方式优化-重新构建查询

为什么查询会慢

如果我们发现我们的查询比较慢我们可以通过以下两个步骤分析:
1.判断我们是否检索了大量的数据,有可能是行,也有可能是列。
2.确认Mysql服务器层是否在分析大量超过需要的数据行。

是否向数据库请求了不需要的数据

1.查询不需要的记录
在MySql中我们是先返回全部结果再进行计算 所以我们只查我们需要的。
2.取出全部列
我们在项目中很多人都会直接select *。取出全部列,会让优化器无法完成索引覆盖的扫描,而且会带来额外的I/O,内存和CPU的消耗。
3.多次重复查询
如果重复执行相同查询,然后每次返回数据相同。这时候会耗费额外的I/O,我们应该将这个数据缓存起来,不应该经过我们的数据库。

重新构建查询

一个复杂查询还是多个简单查询

我们设计查询语句的时候需要考虑一个问题,到底是用一个复杂查询还是多个简单查询来。在Mysql的内部美妙能够扫描内存中上百万行数据,在有些情况下将大查询分解为多个小查询很有必要。

切分查询

有时候对于一个大查询我们需要”分二治之”,将大查询切分成小查询,每个查询功能完全一样,只完成一小部分,每次只返回一小部分的返回结果。

删除旧的数据就是一个很好的例子。定期地清楚大量数据时,如果用一个大的语句一次性完成,则可能需要一次 锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞很多小的但很重要的查询。将一个大的DELETE语句切分成多个较小的查询可以尽可能小地影响MySql性能,同时还可以减少MySQL复制的延迟。

举个例子来说如果我们要删除1亿条数据,我们可以写一个循环每次删除前一万条。这样可以将服务器上原本一次性的压力分散到一个很长的时间段中,可以大大降低对服务器的影响,还可以大大减少删除锁的持有时间。

分解关联查询

很多高性能的应用对关联查询进行分解。简单地,对每一个表进行一次单表查询,然后将结果再应用程序中关联。

到底为什么要这么做?好处如下:
1。让缓存效率更高。在我们的应用程序中可以方便地缓存单表查询对应的结果对象。我们把关联查询分解后就可以很好的利用缓存。
2。将查询分解后,执行单个查询可以减少锁的竞争。
3.将应用层做关联,可以更容易对数据库进行拆分,容易做到高性能和可扩展。
4.查询效率有可能也有提升,in代替关联的话就比关联的高。
5.可以减少冗余记录的查询。在应用层做关联查询,意味着对于某条记录应用只需要查询一次。

你可能感兴趣的:(数据库,mysql)