mysql聚集索引 和 非聚集索引

索引

聚集索引
索引的键值的逻辑顺序决定表中数据(行)的物理顺序,可以理解为如果索引是连续的,那么表中数据在存储介质上的顺序也是一致的。
就如同在字典中通过拼音查找一个汉字,字典中拼音也是按照顺序连续排列的(a、b、c、d),对应的汉字就按照这个顺序连续排列。在使用聚集索引查找一个范围的值时,可以通过索引找到第一条数据,然后根据数据的物理地址连续的特点查找这条数据相邻的数据,这样能够快速的找到对应的想要查找的数据。
非聚集索引
索引的键值逻辑顺序与数据的物理存储顺序无关,虽然索引的键值是连续的,但是他们对应的数据在介质中的物理顺序却不是连续的。索引的记录节点有一个记录指针,指向子树的根节点,存储子节点所在磁盘块的地址。

二叉查找树
在这里插入图片描述
平衡二叉树
在二叉查找树的基础上满足任意节点的两个子树高度差为1
在这里插入图片描述
平衡二叉树,在插入或删除节点时会导致失衡,这时候可以根据旋转来解决。

b树
b树 中的b指的是balance 平衡的意思,b树是指平衡多路查找树。
在这里插入图片描述
特征:

  1. 每个节点最多有m个孩子。
  2. 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
  3. 若根节点不是叶子节点,则至少有2个孩子
  4. 所有叶子节点都在同一层,且不包含其它关键字信息
  5. 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
  6. 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
  7. ki(i=1,…n)为关键字,且关键字升序排序。
  8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)
    在这里插入图片描述
    在这里插入图片描述
    b+树
    在这里插入图片描述
    在这里插入图片描述
    通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

可能上面例子中只有22条数据记录,看不出B+Tree的优点,下面做一个推算:

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗3)。也就是说一个深度为3的B+Tree索引可以维护103 * 10^3 * 10^3 = 10亿 条记录。

实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree的高度一般都在24层。MySQL的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要13次磁盘I/O操作。

数据库中的B+Tree索引可以分为聚集索引(clustered index)和辅助索引(secondary index)。上面的B+Tree示例图在数据库中的实现即为聚集索引,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值