查询太慢?重构一下查询语句!
【摘要】 重构查询的方式就是我们之前提到的一种优化方式,我们的SQL查询太慢,有时候是因为我们写的这个SQL太糟糕了。我们需要换一种方式去写SQL,但还是要返回一样的结果。 一个复杂的查询还是多个简单的查询就如标题所言,我们在设计查询的时候,需要考虑的一个重要问题是:是否需要将一个复杂的查询变为多个简单的查询。 切分查询有时候啊,我们需要把一个大查询“分而治之”,将大查询变为小查询,每个查询功能完全...
重构查询的方式
就是我们之前提到的一种优化方式,我们的SQL查询太慢,有时候是因为我们写的这个SQL太糟糕了。我们需要换一种方式去写SQL,但还是要返回一样的结果。
一个复杂的查询还是多个简单的查询
就如标题所言,我们在设计查询的时候,需要考虑的一个重要问题是:是否需要将一个复杂的查询变为多个简单的查询。
切分查询
有时候啊,我们需要把一个大查询“分而治之”,将大查询变为小查询,每个查询功能完全一样,只完成一小部分,每次只返回一小部分的结果。
你比如说,想要删除旧的数据,,如果说你用一个大的语句一次性完成的话 ,则可能需要一次性锁住很多数据,占满整个事务日志,耗尽系统资源,阻塞很多小的,但是重要的查询。所以将一个大的delete语句切分为多个较小的查询可以尽可能小地影响MySQL性能,同时还可以减少MySQL复制的延迟。
:ice_cream:你比如说下面这个例子:
DELETE FROM messages WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH);
我们就可以使用下面同样的方法来解决:
rows_affected = 0
do {
rows_affected = do_query(
"DELETE FROM messages WHERE created < DATE_SUB(NOW(),INTERVAL 3 MONTH) LIMIT 10000")
} while rows_affected > 0
我们通过上面的语句,就实现了一次删除啊10000行数据这样一个限制,一次删除10000行数据是一个比较高效而且对服务器影响也是最小的做法。如果,每次删除数据后,都暂停一会再做下一次删除,这样也可以将服务器上原本一次性的压力分散到一个很长的时间段,也就大大的降低了对服务器的影响。
分解关联查询
很多高性能的应用都会对关联查询进行分解。简而言之就是,可以对每一个表进行一次单表查询,然后将结果在应用程序中进行关联。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)