[MySQL优化案例]系列 -- 取出超大结果集的技巧

  1. 云栖社区>
  2. 博客>
  3. 正文

[MySQL优化案例]系列 -- 取出超大结果集的技巧

科技小先锋 2017-11-07 20:09:00 浏览955
展开阅读全文
看看正序取得结果的耗时:
mysql>SELECT a.HandicapID, FROM_UNIXTIME( a.AddTime, '%y-%c-%e %H:%i' ) AS ShowAddTime, a.MatchID, a.MakerID, a.HandicapNumber ...
FROM MatchHandicap AS a
LEFT JOIN MatchInfo AS b ON ( a.MatchID = e.MatchID )
LEFT JOIN Team AS c ON ( e.HomeID = c.TeamID )
LEFT JOIN Team AS d ON ( e.AwayID = d.TeamID )
LEFT JOIN BookMaker AS e ON ( a.MakerID = e.MakerID ) ORDER BY a.HandicapID LIMIT 11910298, 20;
........
........
20 rows in set (1330 sec)
很恐怖吧,暂且不论这个SQL语句其他可以再优化的地方,把它改造成用倒序取得结果的方式试试看:
mysql>SELECT a.HandicapID, FROM_UNIXTIME( a.AddTime, '%y-%c-%e %H:%i' ) AS ShowAddTime, a.MatchID, a.MakerID, a.HandicapNumber ...
FROM MatchHandicap AS a
LEFT JOIN MatchInfo AS b ON ( a.MatchID = e.MatchID )
LEFT JOIN Team AS c ON ( e.HomeID = c.TeamID )
LEFT JOIN Team AS d ON ( e.AwayID = d.TeamID )
LEFT JOIN BookMaker AS e ON ( a.MakerID = e.MakerID ) ORDER BY a.HandicapID DESC LIMIT 20;
........
........
20 rows in set (0.05 sec)
两次查询的耗时简直是天差地别:1330s VS 0.05s,。有些程序员很懒,或者没有考虑过这个问题,经常会在取结果的时候一直按照同一种排序方式,而没有考虑到当该排序方式碰到超大结果集时会变得非常慢的问题。因此,我们可以在程序中约定,当按原来的排序方式取得结果过程中,如果LIMIT START,OFFSET中的START的值超过总记录数的一定比例(例如一半),就将排序方式倒过来,虽然这么做可能会导致一些其他小问题,但我认为这是非常值得的。


本文转自叶金荣51CTO博客,原文链接:http://blog.51cto.com/imysql/310599,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
科技小先锋
+ 关注