目录

MySQL-深度分页如何优化

MySQL 深度分页如何优化?

例如 select * from t1 order by 10000, 10 查询 10000

10010 页数据,mysql会先查询出 100010 页,再抛弃 100000 。这个操作会产生大量的无用IO/CPU消耗

范围查询

1.当ID能保证连续无空缺时,可以使用范围查询。

select * from t1 where id > {seed_id} and id <= {seed_id + step} order by id;
select * from t1 where id > {seed_id} limit 10
子查询

我们先查询出 limit 第一个参数对应的主键值,再根据这个主键值再去过滤并 limit,这样效率会更快一些。

select * from t1 where id >= (select id from t1 limit {seed_id}, 1) limit {step};

不过这个方法虽然没有限制ID是连续的,但是限制了ID必须是正序的

inner join延迟关联

延迟关联和上面的子查询本质没有区别。

select * from t1
inner join (select id from t1 limit {seed_id}, 1) t2
on t1.id >= t2.id
limit {step};

比如查询10000~100010。那就先查询出10001

然后将主表t1与t2相连,仅仅保留t1.id大于等于t2.id的前10条数据

覆盖索引