1、使用 limit 如:
mysql> select * from useraccess limit 0,10; #前十条
mysql> select * from useraccess limit 10,10; #再十条
但是,因为mysql在经过从头扫描后取某部分的十条,数据量很大时,越往后速度越慢。
策略:
1、如博客园首页,只有200页
2、索引表中扫,用到覆盖索引,速度优势不大
3、方案:
记录当前页的最大和最小ID,有2种形式:
通过当前页的最大id,判断后取下10条
mysql> select * from useraccess where id > 10000 limit 10;
通过记录当前页的最小id,取上10条。(id排序速度快)
mysql> select * from useraccess where id < 10001 order by id desc limit 10;
a、页面只有上一页,下一页
max_id min_id
下一页:select * from useraccess where id > max_id limit 10;
上一页:select * from useraccess where id < min_id order by id desc limit 10;
如天涯国关首页:
b、如下
到7:
SELECT * from db WHERE id in (SELECT id from (SELECT id FROM db WHERE id>40 LIMIT 30) as N ORDER BY id desc LIMIT 10);
[Err] 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
解决:再嵌套一层
SELECT * from db WHERE id in (SELECT id FROM (SELECT id from (SELECT id FROM db WHERE id>40 LIMIT 30) as N ORDER BY id desc LIMIT 10) as pp);
到2:
SELECT * FROM db WHERE id in ( SELECT id FROM ( SELECT id FROM (SELECT id FROM db WHERE id < 31 ORDER BY id DESC LIMIT 20) as N #取到 30-11 降序。 ORDER BY id LIMIT 10 #order by 默认升序,所以取到11-20 ) as pp );
注意:在取30-11时有两种可能,一是不用降序取,取到1-20,但这是靠近开始页,数据少,如果当前页靠后,那么数据就多了;另外就是按降序取30-11这样数据不多