数据库索引学习总结

本文主要探讨数据库索引的原理,重点讲解了二叉树、B树、B+树、B*树和Hash索引的数据结构及其在数据库查询中的作用。B+树作为MySQL常用索引类型,具有稳定查询效率和便于范围查找的特点。同时,文章指出非唯一索引的建立以及索引顺序对查询的影响,并对比了MyISAM和InnoDB存储引擎的索引实现差异。

任何数据结构都是满足特定的需求而出现的。数据库表的数据在存储时,可能是无序的,分散的,这样的好处是灵活,利用率高。然后却不利于查询,为了在查询的时候,为了大大的提高查询效率,就需要有一个特定的数据结构满足查找的特点,这种数据结构就是数据库索引。

这个学习笔记不描述聚簇,唯一等索引的概念,主要关注数据结构。但也不记录严格的数据结构的形状、定理等,主要还是从理解角度进行总结。

1.二叉树
二叉树不直接作为索引,但是索引的底层基础。二叉树,平衡二叉树,红黑树等描述了基本的树形结构。

2.B树,B+树,B*树。
真正的数据库索引主要的数据结构。B树又称B-树,其进化后又出现了B+树和B*树。
1)树上的每一个节点,对应一个页的大小,一个页的整数倍,正好是磁盘一次IO读取的内容,以此保证了IO效率。
2)是一种有顺序的多路搜索的树。查询条件进入索引树后,按照一定的查找算法(如二分),定位到存放数据指针的下一个孩子节点,最终定位到数据指针,获取数据。
3)B树的特点是关键字及指针分布在各个节点上,如果命中则查找完成。
这里写图片描述
4)B+树,所有的关键字都以有序链表的方式出现在叶子节点中。且每个叶子节点都有一个指向后续叶子节点的指针。
这里写图片描述
B+树的好处在于,占用数据量比B树要小(还没有彻底理解小在哪)。B+树的查询效率更稳定,每次查询都在叶子节点完成。同时,指向后续叶子的指针使得在范围查找时更加快速。
5)B*树,B+树的变种,增加了非叶子节点指向兄弟的指针。在分裂时可以通过指针直接定位到兄弟节点。
这里写图片描述
同时B*树对自己的性状有新的定义,B*树定义了非叶子结点关键字个数至少为(2/3)M(代替B+树的1/2),即块的最低使用率为2/3,所以B树分配新结点的概率比B+树要低,空间使用率更高。

MySql常用的索引即为B+树性质的数据结构。

3.下面来解答几个问题:
1)为什么创建索引的顺序会影响索引的使用?
因为对表上的多个列创建索引时,B+树上的关键字的值是按列的顺序组合起来来生成的。
因此,查询条件包含索引的所有字段,以及完全匹配其字段顺序;只匹配索引的第一列;只匹配第一列的前缀;第一列的范围查找;第一列全匹配,第二列匹配前缀。这些类似的情况下,可以使用索引;其它情况下,会影响到索引的使用。

2)非唯一索引的时候,索引树是如何建立的?
即使索引列取值相同,但是对应的数据地址肯定有区别,所以索引树上还是必须区分指向不同的地址。这时候,数据库系统会在有必要时,为非唯一索引增加一个隐藏的取值列,和索引列共同生成关键字,这个关键字是唯一的。

4.Hash索引
采用key-value形式创建的索引,核心点在于hash算法的选择,使得hash值均匀分布。因为不同的索引列可能有相同的hash值,因此每个hash值对应一个数据桶(bucket)。查询条件计算出hash值后则在对应的bucket里找到所需的数据。
Hash索引的查询效率非常之高,不需要像B树一样沿树搜索而是一次定位。但是Hash的缺点也是明显的:
1)不同数据之前不存在顺序的概念,因此范围查找不能使用索引,而且order by也不能借用索引的结果直接给出。
2)如果是多列组合的索引,查询条件只有第一列,也无法利用Hash索引。
3)数据量很大时,同样的hash值增多,因此在bucket里进行表扫描的概率大大增加。查询效率并不一定比B树要高。

5.索引树的分裂,有一定的算法和规则,有必要时可查阅相关资料。

6.MySql MyISAM和InnoDB两个存储引擎的索引实现。
都是使用B+树结构。区别在于
1)MyISAM索引文件和数据文件是分离的。MyISAM的主键索引,和辅助索引类似,叶子节点都指向数据地址的指针。
2)而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
而InnoDB的辅助索引,其叶子的指针是主索引的关键字值。
这种特性会造成,按辅助索引查找需要找两次索引,主键索引最好使用自增列,因为这样不涉及到索引树的分裂而只涉及到索引树的末尾追加。

PS:存储引擎指使用不同的存储机制、索引技巧、锁定水平来组织数据库,以求获得不同的数据库功能、特性、能力。比如Hash存储引擎,B树存储引擎,LSM树(Log-Structured Merge Tree)存储引擎(放弃部分读能力,大力加强写能力)等等。
MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。

PS:全文索引,搜索引擎的倒排索引等,虽不尽相同也可触类旁通,思路是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值