MySQL 重构查询的方式

  主题:如何重构查询冰战士何时需要使用这种技巧

  (1)一种复杂查询还是多个简单查询

    设计查询的时候需要考虑的一个重要问题是是否需要将一个复杂的查询分成多个简单的查询。在平时我们总是强调需要数据库完成尽可能多的工作,这样做的逻辑在于以前总是认为通络通信,查询解析以及优化师一种代价很高的事情。但是MySQL在设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效。线代的网络速度比以前要快很多,无论是带宽还是延迟。

    MySQL内部内部每秒能够扫描内存中上百万行的数据,相比之下MySQL响应数据给客户端就要慢很多了。在其他条件相同的时候,使用尽可能少的查询当然是更好的。但是,将一个大查询分解成小查询是很有必要的。不过再应用设计的时候,如果一个查询能够胜任时还写成多个小查询那就是傻逼

  (2)切分查询

    有时候对于一个大查询我们就要将大查询切分成小查询,每个查询功能完全一样,但是只完成一小部分,每次返回一小部分查询结果。

    删除旧数据就是一个很好的例子。定期的清除大量数据时,如果用一个大语句一次性完成的话,则可能需要一次锁住很多的数据,占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。将一个大的DELETE语句切分成多个较小的查询尽可能小的影响MySQL性能,同时还减少MySQL复制到延迟。同时,需要注意的是,如果每次删除数据后,都暂停一会儿再做下一次杀出,这样也可以将服务器上原本一次性的压力分散到一个很长的时间段中,就可以大大的降低对服务器的影响,还可以大大减少删除时锁的持有时间

  

   (3)分解关联查询

    简单的关联查询分解就是可以对每个表进行一次单表查询,然后将结果在应用程序中进行关联。例如:

select * from tag
    join tag_post ON tag_post.tag_id=tag.id
    join post ON tag_post_id=post.id
    where tag.tag='mysql'

 

可以分解成

select * from  tag where tag='mysql'
select * from tag_post where tag_id=1234
select * from post where post.id in (123,456,567,9098,8904)

 乍一看,这样做并没有什么好处,原本一条查询,这里却变成多条查询,返回的结果又是一模一样。事实上,用分解关联查询重构查询有如下的优点:

      ①让缓存的效率更高。②将查询费恩节后,执行单个查询可以减少锁竞争。③在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可拓展。④查询本身效率也可能有所提升。⑤可以减少冗余记录的查询。⑥更进一步,这样做相当于在应用中实现了哈希关联,而不是使用MySQL的嵌套循环关联

    在很多情况下,通过重构查询将关联放到应用程序中将会更加高效,这样的场景有很多。比如:当应用能够方便的缓存单个查询的 结果的时候、当可以将数据分布到不同的MySQL服务器上的时候、当能够使用IN代替关联查询的时候。

 

posted @ 2019-04-08 21:15  阿十三  阅读(599)  评论(0编辑  收藏  举报