重构查询的方式

来源:互联网 发布:淘宝中的查询热度 编辑:程序博客网 时间:2024/06/06 02:47

这两天被领导安排了优化SQL的任务,因为应用在线上多次出现了查询超时的异常。在这做下总结。

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

我们总是认为网络通信,查询解析和优化是一件代价高昂的事情,总是强调需要数据库层完成尽可能多的工作,但是这样的想法对于MySQL并不适用,MySQL内部每秒能够扫描内存中上百万行数据,相比之下,MySQL把响应数据传输给客户端就慢很多了。MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。别害怕将一个大查询分解为多个小查询,好好衡量一下这样做是不是能提高性能,减少工作量。

切分查询

把一个大查询切分成小查询,每个查询功能完全一样,只完成任务的一部分。比如一次清理大量数据时,用切分查询就很有效。因为一个大的语句一次性完成的话,则可能需要一次锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞很多小的但重要的查询。
一个需要删除大量数据的DELETE语句完全可以分批次完成,每次DELETE一部分数据,然后暂停一会儿再做下一次删除,这样做不仅可以缓解上面的问题,同时能将服务器上原本一次性的压力分散到一个很长的时间段中,就可以大大降低对服务器的影响,大大减少删除时锁的持有时间。

分解关联查询

高性能的应用都会对关联查询进行分解。用分解关联查询的方式重构查询有如下优势:

  • 让缓存的效率更高。很多应用程序可以方便地缓存单表查询对应的数据。
  • 单个查询获取的数量更少,可以减少锁的竞争。
  • 在应用层做关联,更容易做到高性能和可扩展。
  • 查询本身效率也有提升。比如可以IN()代替关联查询,更有效的利用索引,
  • 可以减少冗余记录的查询。

很多场景下,通过重构查询将关联放到应用程序中将会更加高效。

原创粉丝点击