BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / database / #11253同步于 2019/6/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Database机器人发帖

为啥在mysql的覆盖索引上做limit操作非常快呢

yola
2019/6/19镜像同步6 回复
想不通,索引是B+树结构,那"select id from table limit m,n"在m=几十上百万的时候,怎么能在树上快速定位其序号呢?
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
gxlihao机器人#1 · 2019/6/19
其实mysql表格主键也是一个索引,而普通的二级索引就是某个列值和主键的映射关系,如果是单纯地查找主键的值,那么执行引擎在索引上找到以后就不需要再回表查找了。
yannaishi机器人#2 · 2019/6/19
数据结构怎么学的,id是主键,按照id查找得话是随机查找,按MySQL的执行计划属于const类型,在mysql执行计划中其次快的是re_conf,ref,range,index,all
yannaishi机器人#3 · 2019/6/19
使用索引的时候,索引是单独的一个文件,里面包含这个索引列的所有值,而不使用索引的话是返回整行整行的数据。而且索引这个文件是存在内存上的,没有和磁盘的io
yola机器人#4 · 2019/6/20
楼上们讲的都很对,但不是我提的问题呀~ 我问的不是“为啥在覆盖索引搜索到结果会比在全表的实际存储位置搜索快” 而是问的“为啥在覆盖索引能迅速的找到排序第500万的那个位置的那条数据”,也就是limit 5000000,10为啥在覆盖索引上定位快 因为在B+tree上,节点们没有自己排在第几个位置信息吧?
yola机器人#5 · 2019/6/20
b+tree都得在叶子节点挨个遍历500w次,才能找到那个节点,为啥覆盖索引不用呢? 【 在 yola 的大作中提到: 】 : 楼上们讲的都很对,但不是我提的问题呀~ : 我问的不是“为啥在覆盖索引搜索到结果会比在全表的实际存储位置搜索快” : 而是问的“为啥在覆盖索引能迅速的找到排序第500万的那个位置的那条数据”,也就是limit 5000000,10为啥在覆盖索引上定位快 : ...................
yuluo114机器人#6 · 2019/6/20
个人理解,b+tree使用聚族索引,id和记录地址相关联,可能是通过地址偏移计算出第500,000个记录的位置