数据库索引简介


数据库索引简介

索引是数据库中辅助存储引擎快速获取数据的数据结构,形象地说就是数据的目录。每一条索引记录除了包含索引值以外,还包含索引值对应数据表记录的存储地址(指针)。通过使用索引,数据库可以在不扫描整个表的情况下快速找到与查询条件匹配的记录。

索引可以显著提高查询速度,并能优化排序和分组操作。但索引需要占用额外的存储空间,会降低插入、更新和删除操作的性能,因为每次写操作都需要更新索引。

索引的底层数据结构

适合对数据进行索引的常用数据结构包括:二叉树、红黑树、B−Tree和B+Tree。

二叉树

二叉树的特点:左边子节点的数据小于父节点数据,右边子节点的数据大于父节点数据。如下图所示,表中的col2列建立了索引,如果要查找索引为65的行,只需要查找两次。

mysql

但如果要索引的字段是一个按照顺序递增的值,就不再适合使用二叉树建立索引,因为此时建立的索引将会变成一个链式索引,如下图所示,如果为表中的col1字段建立索引,要查找值为6的节点需要6次遍历才能找到。

mysql

红黑树

红黑树是一种二叉平衡树,因为它将任意节点的左右子树高度差控制在规定范围内以达到平衡状态,这样就可以大大提高查询效率。如下图所示,此时如果再查找值为6的节点只需要遍历3次就能找到了,但红黑树也有缺点,即当存储大数据量时,树的高度就会变的不可控,数量越大,树的高度越高,查询的效率将会大大降低。

红黑树

B−Tree

B−Tree是一种多路二叉树,具有以下特点:1、叶子节点具有相同的深度,叶子节点的指针为空。2、所有的索引元素不重复。3、节点中的数据索引从左到右递增排列。

例如在下图中查找索引值为49的数据,需要首先从父节点中查找49所在的叶子节点,再在叶子节点中查找索引值为49的数据。

B-Tree

B+Tree

B+Tree是B−Tree的变种,具有以下特点:1、非叶子节点不存储数据,只存储索引,这样非叶子节点就可以存放更多的索引。2、叶子节点包含所有索引字段。3、叶子节点之间用指针连接,提高区间访问的性能。

例如在下图中查找索引值为49的数据,需要首先从父节点中查找49所在的子节点,再通过子节点查找49所在的叶子节点,最后在叶子节点中查找索引值为49的数据。

B+Tree

内容总结

与红黑树相比,B−Tree和B+Tree两种数据结构都更加矮胖,存储相同数量级的索引数据时,层级更低。

B−Tree和B+Tree之间一个很大的不同,就是B+Tree的非叶子节点上不储存值,只储存索引,而叶子节点上储存了所有索引和值的集合,并且节点之间都是有序的。这样的好处是每一次磁盘IO能够读取的节点更多,这样就大大减少了磁盘的IO次数。

此外,B+Tree也是排好序的数据结构,数据库中>(大于)和<(小于)或者order by等操作都可以直接依赖这一特性。正是因为B+树这些优点,所以MySQL中对于索引使用的主要数据结构就是B+Tree。

MySQL的常用索引

MySQL常用的索引从功能上分为主键索引、唯一索引和普通索引,从字段数量上分为单列索引和组合索引。

主键索引就是在MySQL主键上创建的索引,在为数据表创建主键约束时主键索引会自动创建,一个表只能有一个主键索引,同时主键索引也是唯一索引。主键索引的创建请查看“MySQL的主键约束详解”一节。

唯一索引用于保证数据表中数据的唯一性,在为数据表创建唯一约束时系统会自动创建一个同名的唯一索引,一个表只能有一个主键索引,但可以有多个唯一索引。唯一索引的创建请查看“MySQL的唯一约束详解”一节。


发表评论

评论数量:0