索引本质是一种帮助数据库排好序的数据结构,类似于目录;(表中的行数据,在磁盘的存储位置,不一定放在一起)
索引的数据结构
二叉树、红黑树、Hash表、B-Tree
B-Tree:
叶子节点具有相同的深度;
叶子节点指针为空;
所有索引元素不重复;
节点中数据索引从左到右依次递增;
B+Tree:
非叶子节点不存储data,只存储索引(冗余,相当于取了部分叶子节点的元素),可以存储更多的数据;
叶子节点包含所有索引字段;
叶子节点用双向指针链接,提高访问速度
推算3层的B+树可以存放上的数据量=
首层:仅存放索引,叶节点 16kb,bigint-8b,文件地址-6b,一个叶子节点可以存放索引数量 = 16kb/(8+6)b=1170;
第二层:仅存放索引,叶节点 16kb,bigint-8b,文件地址-6b,一个叶子节点可以存放索引数量 = 16kb/(8+6)b=1170;
第三层:假设存放所有字段,叶节点16kb,按照1kb/行来算,可以存放16(16/1)行;
1170*1170*16 = 21902400
这意味,仅需要进行三次的磁盘IO就可以找到具体数据,相比于没有索引的情况下的2000W次IO,大大减少时间消耗。
MYSQL高版本,将根节点常驻内存
Hash:
常用的hash算法:MD5、CRC16、CRC13等。
对索引key进行一次hash计算就可以定位出数据存储的位置;
很多时候Hash索引要比B+树索引要快,因为树结构可能根据树高度需要多次IO,而hash可能一次就找到了
仅支持 = 、in,不支持范围查询;--- 致命的弊端
hash冲突问题:hash值相同时,排在链表后面
索引分类
- 聚集索引与非聚集索引
聚集索引的叶节点就是数据节点;而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。显而易见,聚集索引的优势是很明显的,而每个表中只能有一个聚集索引的规则,这使得聚集索引变得更加珍贵。
- 联合索引与单值索引
联合索引:由多个字段组成的索引
联合索引的最左前缀原理:按照建立索引的字段先后顺序排序。
例如索引 name,age,先按照name字段排序,排完序之后再按照age排序;如果直接使用age字段,可能查到的数据是乱序的,那么必须全表扫描。
- 覆盖索引与非覆盖索引
覆盖索引定义:mysql执行计划explain结果里的key有使用索引,如果select后面查询的字段都可以从这个索引的树中获取,这种情况一般可以说是用到了覆盖索引,extra里一般都有using index;覆盖索引一般针对的是辅助索引,整个查询结果只通过辅助索引就能拿到结果,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值
本文深入探讨了数据库索引的本质,包括B-Tree和B+Tree的数据结构特点,以及它们在存储和查找效率上的优势。B+Tree的非叶子节点不存储data,叶子节点通过双向指针链接,提高访问速度。同时,文章提到了Hash索引的快速定位特性,但其不支持范围查询的问题。还介绍了聚集索引与非聚集索引、联合索引与单值索引、覆盖索引与非覆盖索引的区别。通过对索引的全面理解,能有效提升数据库查询性能。
1063

被折叠的 条评论
为什么被折叠?



