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条数据