之前在书上看到,大致意思是索引上存储到到表中的一列数据,根据rowid就很快查询到需要的数据。但是并不是很能理解。索引是跟表独立的吗,索引能很快查询到?还是说因为存在索引,所以不会进行全表扫描?还是说怎么?
索引这块看着有点懵
看看Dictionary 或者hashmap的实现,一个道理。原则上多一个硬盘定位读写。
1.索引跟表是独立的
2.索引可以很快查到
3.进不进行全表扫描看你设置的索引
这是一个索引解析,有时间再看看索引解析文档,一次性理清楚后续工作就不容易出错了
https://www.imooc.com/article/11725
你缺少了一个基本知识点
所有的查找优化算法都是基于有序序列.
对无序数据的唯一查找方法,就是遍历.
什么是有序?索引.
什么是无序?没有索引
InnoDB,聚簇索引 = 索引 + 数据
MyISM,普通索引 = 索引
本质的意思是这样的,直接寻址和间接寻址的概念,
当你知道rowid时,若是线性存储,那么只需要查询一次,即根据地址,直接在数据文件中查询,所以会非常快。
当索引和表不是分开存储的,例如mysql的IOT时,索引和数据是同一个文件,都是B+ tree,都知道tree在底层就是链表,而一个tree查询多少次,取决于它的树的深度,例如最常见的3层tree结构,它需要三次查询。
这个其实很好理解,假设外卖员拿到的地址是顾客地址,那么直接送餐就结束了。但是现在告诉你它不是点餐的顾客,外卖员找到的时候,又告诉你一个地址,你跑了两趟,乃至有可能更多。
为什么不存在全表扫描,因为在Oracle的索引中存储了数据文件的地址,当找到rowid时,相当于得到了某一条数据的地址,所以不用全表扫描。
后续的概念可以参考操作系统书籍,当查询次数越多时,产生的缺页概率也越大,这就导致非常慢。