mysql深分页问题
10 分钟阅读
•
588 字
+
1150 词
把条件转移到主键索引树
mysql
select id,name,balance from account where update_time> '2020-09-19' limit 100000,10;
- 通过 普通二级索引树 idx_update_time,过滤update_time条件,找到满足条件的记录ID。
- 通过ID,回到 主键索引树 ,找到满足记录的行,然后取出展示的列( 回表 )
- 扫描满足条件的100010行,然后扔掉前100000行,返回。
主键id
了,之前SQL的
update_time
这些条件咋办呢?抽到
子查询
那里嘛~
子查询那里怎么抽的呢?因为二级索引叶子节点是有主键ID的,所以我们直接根据
update_time
来查主键ID即可,同时我们把
limit 100000
的条件,也转移到子查询,完整SQL如下:
mysql
select id,name,balance FROM account where id >= (select a.id from account a where a.update_time >= '2020-09-19' limit 100000, 1) LIMIT 10;
INNER JOIN 延迟关联
mysql
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;
标签记录法
mysql
select id,name,balance FROM account where id > 100000 order by id limit 10;
id
索引。但是这种方式
有局限性
:需要一种类似
连续自增
的字段。
使用between...and...
limit
查询转换为已知位置的查询,这样MySQL通过范围扫描
between...and
,就能获得到对应的结果。
如果知道边界值为100000,100010后,就可以这样优化:
mysql
select id,name,balance FROM account where id between 100000 and 100010 order by id;