MySQL深分页问题

本文最后更新于:2022年7月29日 上午

概览:MySQL深分页

分页

1
2
3
4
5
# 查询前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慢的原因:

  1. mysql会扫描100000 + 10行数据,然后丢弃掉前100000行数据
  2. 这样的操作会进行大量回表查询,去聚簇索引中查看数据是否符合。

深分页解决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;

把查询条件转移到主键上,然后使用inner join来做关联。

参考链接:https://cloud.tencent.com/developer/article/1884103


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!