视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysqllimit大偏移的一个可能的优化方法
2020-11-09 14:03:24 责编:小采
文档

mysql limit 语句在大数据量时候,limit后的偏移量过大,第一次查询会特别慢,因为mysql默认是开启查询缓存的,所以,对于第二次再次执行大偏移查询不会有影响。 示例:100万的一个表,id做主键,auto_increment。 需要查询:SELECT * FROM table ORDER BY i

mysql limit 语句在大数据量时候,limit后的偏移量过大,第一次查询会特别慢,因为mysql默认是开启查询缓存的,所以,对于第二次再次执行大偏移查询不会有影响。

示例:100万的一个表,id做主键,auto_increment。

需要查询:SELECT * FROM table ORDER BY id DESC LIMIT 990000,100

比较慢。

常见的办法是:SELECT * FROM table WHERE id >=(SELECT id FROM table ORDER BY id DESC LIMIT 990000,1) ORDER BY id DESC LIMIT 100

id可能不连续,而且排序也可能不是只依赖于id, 这种办法基本上无法在实际项目中应用。

比如,我们的实际项目中,有排序非常复杂的方式:ORDER BY (column1 + column2) * column3 DESC,等等这些方式,一百万的数据,如果偏移量990000,那么反过来的排序应该更接近头部:

-------------------------------------------------------------------[99万-|100条]--100万

需要实现:SELECT * FROM table ORDER BY columns DESC LIMIT 990000, 100

推测出一种解决办法:反向排序,然后截取头部,再次反向,得到结果:

$head = max(100万-99万-100, 0 );

SELECT * FROM (SELECT * FROM table ORDER BY columns ASC LIMIT $head, 100 ) AS t ORDER BY columns DESC

优化完成,对于靠近末尾的,速度和开头的一样快,但如果取中间的偏移量,则没有差别。

下载本文
显示全文
专题