查询太慢?重构一下查询语句!

举报
阿柠 发表于 2022/10/17 23:55:08 2022/10/17
【摘要】 重构查询的方式就是我们之前提到的一种优化方式,我们的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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。