bitsCN.com
以前我在mysql中使用limit 100000,20的方法分页,相信你也是这样。但是应该怎么做才能提高效率,让分页代码更高效更快捷呢?
第一部分:看分页的基本原理:
mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20 ***************** 1. row ************** id: 1 select_type: SIMPLE table: message type: index possible_keys: NULL key: PRIMARY key_len: 4 ref: NULL rows: 10020 Extra: 1 row in set (0.00 sec)解释一下上面的mysql语句:limit 10000,20的意思是扫描符合要求的10020行,扔掉前10000行,返回后20行。这就是问题所在。如果是极限100000,100,就需要扫描100100行。在高并发的应用中,每个查询需要扫描10W多行,性能肯定会大打折扣。还提到了limit n的性能还好,因为只扫描了n行。
第二部分:根据雅虎几位工程师的说法,一个使用MySQL report的高效分页得到了扩展:在这篇文章中,提到了一个线索方法,提供了一些翻页的线索,比如id desc的Select * from message order,按降序每页20页,目前是第10页。当前页面最大的条目id是1020,最小的是1000。如果我们只提供跳转到上一页和下一页(不提供跳转到第n页),那么处理上一页时SQL语句可以是:
。
处理下一页时,SQL语句可以是:
不管翻了多少页,每次查询只扫描20行。
缺点是只能提供上一页和下一页的链接形式,但是我们的产品经理非常喜欢“上一页1 2 3 4 5 6 7 8 9下一页”的链接形式。我们做什么呢
如果极限m,n是不可避免的,要优化效率,唯一的办法就是让m尽可能小。我们扩展一下前面的clue方法,或者按id desc从消息顺序中选择*,每页20页,目前是第10页,当前页最大的条目id是2519,最小的是2500。
第10页的SQL如下:
例如,要跳到第9页,SQL语句可以写成如下形式:
例如,要跳到第8页,SQL语句可以写成如下形式:
例如,要跳到第7页,SQL语句可以写成如下形式:
跳到第11页:
跳到第12页:
跳到第13页:
原理还是一样的。记录当前页面id的最大值和最小值,并计算跳转页面和当前页面之间的相对偏移量。因为页面相似,这个偏移量不会很大,所以m的值比较小,大大减少了扫描的行数。其实传统的极限m,n的相对偏差一直是第一页,越翻到后面效率越差,上面给出的方法就没有这个问题。
注意SQL语句中的ASC和DESC。如果是ASC的结果,显示的时候记得反转。
在一个总数据为60W的表中测试过,效果非常明显。
bitsCN.com
以上是mysql分页的原理和高效mysql分页查询语句_MySQL的内容。更多相关内容请关注www.AdminJS.cn(www.php.cn)!