问题描述
其实在大多数场景下,分页框架已经帮我们做了很多事情,这里的问题也不会出现,但是有些人还是想要追寻个答案。
即便是数十万数据的的limit查询,offset越大时,查询越慢。
# 这里的status已经添加了索引
select name from user where status=1 limit 10 offset 100000;
探究
思考1:InnoDB底层实现明明是B+树,为什么查找效率不是O(N)呢?
这里就涉及到另一个东西了:
- 聚簇索引
- 辅助索引
聚簇索引
聚簇索引是存放数据和主键索引的数据结构,它的叶子节点是数据
辅助索引
辅助索引也是二级索引,它的结构和聚簇索引一致,也是B+树,但是它的叶子节点存储的是主键索引的值
答案:
当limit查找时,会通过二级索引查找offset个数据的主键索引,再通过主键索引查找具体的数据。offset次随机IO,当然很慢了
思考2:既然知道前offset的数据无用,为什么还要查一遍呢?
这时候又要引入一个东西:
- 逻辑算子
逻辑算子
通常