MySQL索引结构(B+树、聚簇索引)以及聚簇索引、主键索引、唯一索引三者区别

参考:http://blog.jobbole.com/24006/

基本定义

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.
注意:索引是一种数据结构

索引的作用——查询

数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。

但是每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序。

而索引就是一种数据结构,这种数据结构满足特定查找算法的数据结构,以某种方式引用(指向)数据,这样就可以通过索引实现高级查找算法。

目前大部分数据库系统及文件系统都采用B-Tree或其变种B+Tree作为索引结构,MySQL使用B+Tree实现其索引结构。

使用B+树的原因

  1. 平衡二叉树(AVL):旋转耗时
  2. 红黑树:树太高
  3. B树:为磁盘而生

详情见:为什么选择B+树

B+树结构详解

B-Tree有许多变种,其中最常见的是B+Tree,例如MySQL就普遍使用B+Tree实现其索引结构。
与B-Tree相比,B+Tree有以下不同点:

  1. b+树的中间节点不保存数据,同样大小的磁盘页可能容纳更多节点元素。也就是说更加矮胖,磁盘IO少。
  2. 所有的叶子结点使用链表相连,便于区间查找和遍历。

B-树示意图:
在这里插入图片描述
B+树示意图:(注意叶子节点,是只有数据)
在这里插入图片描述

MySQL中B+树索引结构,在经典B+Tree的基础上进行了优化,增加了顺序访问指针。
在这里插入图片描述

在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能,例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。

MySQL索引实例

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。

MyISAM索引实现(非聚簇索引)
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址(也就是非聚簇索引)。下图是MyISAM索引的原理图:
在这里插入图片描述

InnoDB索引实现(聚簇索引)
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
第一个重大区别是InnoDB的数据文件本身就是索引文件(也就是聚簇索引)。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
在这里插入图片描述

聚簇索引(聚集索引)

由上文可知:聚簇索引是叶子节点有数据的,非聚簇索引(二级索引)的叶子节点是指向数据的地址。

聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。非聚集索引指定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致。聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。

聚簇索引的叶子节点就是数据节点。

一张表中只能由一个聚簇索引。因为一张表只能有一种数据的存放方式,不然的话,一个聚簇索引一张表……

聚簇索引的优点:

  1. 聚簇索引将索引和数据行保存在同一个B-Tree中,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高。
  2. 聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的。

聚簇索引的缺点

  1. 聚簇索引的更新代价比较高,如果更新了行的聚簇索引列,就需要将数据移动到相应的位置。这可能因为要插入的页已满而导致“页分裂”。
  2. 插入速度严重依赖于插入顺序,按照主键进行插入的速度是加载数据到Innodb中的最快方式。如果不是按照主键插入,最好在加载完成后使用OPTIMIZE TABLE命令重新组织一下表。
  3. 聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
  4. 聚簇索引可能导致全表扫描速度变慢,因为可能需要加载物理上相隔较远的页到内存中(需要耗时的磁盘寻道操作)。

聚簇索引与主键索引

一般来说,将通过主键作为聚簇索引的索引列,也就是通过主键聚集数据。但是呢,并不能说聚簇索引就是主键索引,也不能说聚簇索引就是唯一索引,因为聚簇索引可以有重复值。

唯一索引

唯一索引是在表上一个或者多个字段组合建立的索引,这个(或这几个)字段的值组合起来在表中不可以重复。一张表可以建立任意多个唯一索引,但一般只建立一个。

主键索引与唯一索引
主键是一种特殊的唯一索引,区别在于,唯一索引列允许null值,而主键列不允许为null值。一张表最多建立一个主键,也可以不建立主键。

唯一索引与聚簇索引
严格来说,聚簇索引不一定是唯一索引,聚簇索引的索引值并不要求是唯一的,唯一聚簇索引才是!在一个有聚簇索引的列上是可以插入两个或多个相同值的,这些相同值在硬盘上的物理排序与聚簇索引的排序相同,仅此而已。

参考:
https://www.cnblogs.com/heqiyoujing/p/11229260.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值