`
风雪涟漪
  • 浏览: 496931 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:8767
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:17675
社区版块
存档分类
最新评论

查询性能的优化 - 重新构建查询的方法 - 拆分一个查询语句

阅读更多

拆分一个查询语句

另一个分解查询的方法是分步解决。本质上来说是相同的,但是不一样的是,运行较小的数据块,这样会影响较少的行。

 

在没有比删除旧数据更好的例子了。删除旧数据需要删除大量的数据,并且如果用一个大语句那么做的话会导致长时间锁定太多的行,写满了事物日志,独占的资源,并且阻塞了一些语句。拆分这个DELETE语句并且使用数量合适的删除语句可以提高性能,并且当一个语句被复制也会降低复制的延迟。举个例子。。

 

mysql> 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行这个数据量可以使每个语句都很有效率,并且每个短小的语句对服务器的影响也非常之小(一个更小的事物在事物引擎中可以得到更多的好处)。还有个好方法就是在DELETE语句之间添加一个停留的时间。这样做是为了通过时间降低负载并且减少锁所占用的时间。

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics