# 查询前10条数据 select * from orders_history where type=8 limit 10;
# 查询第1000条数据之后的10条数据:1001 - 1010 select * from orders_history where type=8 limit 1000,10;
什么是深分页?
当offset也就是偏移量变的非常大时,查询的效率就会变得低下。
select * where type=8 limit 100000,10慢的原因:
mysql会扫描100000 + 10行数据,然后丢弃掉前100000行数据
这样的操作会进行大量回表查询,去聚簇索引中查看数据是否符合。
深分页解决1 —— 子查询
先定位偏移位置的id,然后再往后查询,这种方式适用于id递增的情况。
1 2 3 4 5
select * from orders_history where type=8 limit 1000,10;
select * from orders_history where type=8 and id >= ( select id from orders_history where type=8 limit 1000,1 ) limit 10;
内部子查询可以使用一些条件来走二级索引,只查询主键id
这样利用了二级索引B+树叶子节点的存储特性
而且把limit 1000这样的结果也转移到了子查询之中。
深分页解决2 —— Inner Join延迟关联
1 2 3 4 5
SELECT acct1.id,acct1.name,acct1.balance FROM account acct1 INNER JOIN ( SELECT a.id FROM account a WHERE a.update_time >= '2020-09-19' ORDER BY a.update_time LIMIT 100000, 10 ) AS acct2 on acct1.id= acct2.id;