数据库索引及结构

1 什么是索引

索引是一种特殊的文件,它包含着对数据表中所有记录里的引用指针

索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。

更通俗的来讲,索引就相当于目录。

索引的优点

  • 可以大大加快数据的检索速度
  • 通过使用索引,可以再查询的过程中,使用优化隐藏起,提高系统的性能

索引的缺点:

  • 时间方面:创建和维护索引需要耗费时间。对表中的数据进行增、删、改时,索引需要动态的维护,会降低执行的效率
  • 空间方面:索引需要占用物理空间

2 索引的类型

  • 主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键

  • 唯一索引:数据列不允许重复,允许为NULL的值,一个表允许多个列创建唯一索引

可以通过ALTER TABLE table_name ADD UNIQUE (column);创建唯一索引

可以通过ALTER TABLE table_name ADD UNIQUE (column1,column2);创建唯一组合索引

  • 普通索引:基本的索引类型,没有唯一性限制,允许为NULL值

可以通过ALTER TABLE table_name ADD INDEX index_name(column);创建唯一索引

可以通过ALTER TABLE table_name ADD INDEX index_name(column1,column2);创建唯一组合索引


3 索引的数据结构

3.1 哈希索引

哈希索引类似于数据结构中的哈希表(散列表)。当我们在数据库中使用哈希索引时,主要是通过Hash算法,将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表中的位置;如果发生哈希碰撞,则在对应Hash键下以链表的形式存储。

但我们都知道,Hash值是一个无序的值,所以它无法进行范围查找,也不能利用Hash值去做排序。还有,在Hash碰撞的情况下,需要沿着链表去一个一个的查找,这样降低了查找的效率。

3.2 B+树索引

既然哈希索引由于其无序的特性,使其无法应对范围查找、无法排序,且存在哈希碰撞时效率下降的问题,而树的结构解决了这个问题——它的数据有序排列,且支持范围查询。MySQL中使用的是B+树作为索引的数据结构。为了明白为什么要使用B+树索引,我们需要先从平衡二叉树说起

(1) 平衡二叉树

平衡二叉树相比起哈希索引,很好的解决了范围查找的问题,但平衡二叉树仍然存在两个问题:

1、在大量数据的情况下,树的高度会很大。如图所示的平衡二叉树,一共存入了30个数据。可以看到,整棵树一共有5层,而在最坏的情况下,需要向下查询5次才能知道想要的数据。

2、在范围查找时,存在回旋查找的问题。比如在上面的图中要查找大于25的数,要先定位到25,然后再回到26->27,再回到28->29->30,然后把这些数据拿出来。假如要查询的数据非常多,那么在平衡二叉树的结构中回旋查找的效率是非常慢的。

(2) B树

可以看到,同样是在插入30个数据的情况下,B树要比平衡二叉树更矮。

不同于平衡二叉树,B树的每个节点最多可以存储n个有序的数据,同时还存储着最多n+1个指向下一级节点的指针。以上图为例,每个节点最多可以存储2个数据,节点中最多有3个指向下一级节点的指针。以下面这个子树为例:

根结点中两个数据是26和28,比26小的数据存储在最左边的指针指向的结点,介于26和28的数据存储在中间的指针指向的结点,大于28的数据存储在最右边的指针指向的结点

相较于平衡二叉树,B树更矮,一个结点内能存储更多的有序数据,因此在大量数据的情况下,不需要向更深处遍历数据。

但B树在范围查找方面有着和平衡二叉树相同的问题:如果要查找比25大的数据,B树要先定位到25,再经历26->27->28->29、30,在数据量大的情况下同样要消耗大量时间。

(3) B+树

为了解决在范围查找时,出现的回旋查找的问题,产生了B+树的结构。相比起B树,B+树的非叶子结点仅具有索引的做引,不用来存储数据。数据全部存储在叶子结点中。叶子结点之间通过指针相互连接在一起,有序排列。

当使用B+树查找数据时,假如查找8,先从根结点9开始,向左找到结点5,再向右找到结点7,再向右找到结点8,最后找到叶子结点8.

当使用B+树进行范围查找时,假如找到比8大的数据,就先找到叶子结点8,然后向右遍历,就能找到所有比8大的结点,其查找效率要比B树更高

posted @ 2020-12-27 20:21  maurrinho  阅读(292)  评论(0编辑  收藏  举报