高效MySQL分页方法及原理
复制代码代码如下所示:
MySQL >解释由ID * DESC LIMIT 10000消息顺序选择,20G 1。行***************** **************编号:1 select_type:简单表:消息类型:指数possible_keys:空键:主要key_len:4编号:空10020行:1行:额外的设置(0秒)
10020限制10000,20手段对符合条件的10000线扫描,扔在回归前的最后20行,问题就在这里,如果是限制100000100,扫描100100行,在一个高度并行的应用程序,每个查询需要扫描超过10W,性能会大大降低。在这篇文章中,极限性能是没有问题,因为只有N线扫描它也提到。
一个线索的方法,本文中提到的,页面提供一些线索,如选择或由ID * DESC消息顺序、ID按降序分页,20页,当前是第十页,该页的条目ID最高是9527,最低是9500,如果我们只提供一个页面,接下来这跳页(不提供N个页面跳转),SQL语句,当你处理一个页面可以:
复制代码代码如下所示:
从ID为9527的ID为20的消息中选择*;
在处理下一页时,SQL语句可以是:
复制代码代码如下所示:
SELECT * FROM消息ID<9500订单ID DESC LIMIT 20;
不管翻过多少页,每次只扫描20行。
缺点是我们只能提供到最后一页和下一页的链接,但是我们的产品经理非常喜欢这种链接方式。你是做什么的
如果极限m n,不可避免地,优化效率,只有尽可能的让米小,我们延续之前的线索,或通过ID * DESC消息顺序选择,ID按降序分页,20页,当前是第十页,该页的条目ID的最大值是9527,9500,例如最小,跳到第八页,我看到SQL语句可以写:
复制代码代码如下所示:
SELECT * FROM消息ID > 9527订单ID ASC限制20,20;
跳转到第第十三页:
复制代码代码如下所示:
SELECT * FROM消息ID<9500订单ID DESC LIMIT 20;
原理是一样的。它记录当前页id的最大值和最小值,计算跳转页面和当前页之间的相对偏移量。因为页面是相似的,所以偏移量不大,所以m值相对较小,这大大减少了扫描行数。实际上,传统的限制m和n的相对偏移总是第一页。这样的话翻到后面,效率就更差了,上面的方法就没有这个问题了。
注意在SQL语句中,ASC和DESC,如果是ASC的结果,记得要反它当它显示。
它已经在一个表的总60w数据测试,而且效果非常明显。