余瑜的博客 余瑜的博客
首页
  • 并发
  • 线程池
  • spring
  • maven
  • 其他
  • redis
  • mysql
  • linux
  • zookeeper
  • docker
  • terminal
  • kong插件开发
  • 资料
  • leetCode-简单
  • blog
  • 其他
关于
GitHub (opens new window)
首页
  • 并发
  • 线程池
  • spring
  • maven
  • 其他
  • redis
  • mysql
  • linux
  • zookeeper
  • docker
  • terminal
  • kong插件开发
  • 资料
  • leetCode-简单
  • blog
  • 其他
关于
GitHub (opens new window)
  • redis

  • mysql

    • 高性能mysql学习笔记
    • MySQL中的函数
    • InnoDB和MyISAM区别
    • mysql索引最左原则
    • b+树图文详解
    • 聚集索引与辅助索引
      • 聚集索引与辅助索引
        • 聚集索引
        • 辅助索引
    • 索引合并
  • DB
  • mysql
余瑜
2019-06-14
目录

聚集索引与辅助索引

# 聚集索引与辅助索引

# 聚集索引

InnoDB存储引擎表是索引组织表,即按照主键的顺序存储数据。 当一个表没有主键,或者没有一个索引,Innodb会如何处理呢。请看如下规则:

  • 如果一个主键被定义了,那么这个主键就是作为聚集索引。
  • 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引。
  • 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增。

聚集索引(clustered index)就是按照每张表的主键构造一棵B+树,树中的叶子节点存放着表中的行记录数据,因此,也将聚集索引的叶子节点称为数据页;非叶子节点中存放着仅仅是键值和指向叶子节点的偏移量。每个叶子节点(数据页)都通过一个双向链表进行连接。 由于实际的数据页只能按照一棵B+树进行排序,因此数据库中每张表只能有一个聚集索引。  聚集索引能过特别快的访问针对范围值的查询。

注意:聚集索引并不是在物理存储上是连续的,其只是在逻辑上连续,这有两点: 一、数据页是按照主键的顺序并通过双向链表链接的,因此物理存储上可以不按主键顺序存储。 二、数据页中的记录也是通过双向链表进行维护的,物理存储上同样可以不按主键顺序存储。

聚集索引的好处:

  1. 对于主键的排序查找非常的快(因为其叶子节点是用双向链表链接的)
  2. 对于主键的范围查找非常的快(因为通过叶子节点的上层中间节点,就可以得到叶结点的范围值)

# 辅助索引

辅助索引(Secondary index)也是B+树结构,但其在叶子节点中并不包含行记录的全部数据。除了包含键的值(建立辅助索引的列中的值)外,还包含了一个书签,这个书签用来告诉InnoDB引擎从哪里可以找到与索引相对应的行数据。由于InnoDB引擎是索引组织表,因此,这个书签就是相应的行数据的聚集索引键。 
因为辅助索引不会对影响数据在聚集索引中的组织,所以可以有多个。

除了索引组织表结构外,还有一种堆表的表结构,即行数据的存储是按照插入的顺序存储的。如SQL Server数据库

上次更新: 2021/02/20, 19:26:07

← b+树图文详解 索引合并→

Theme by Vdoing | Copyright © 2018-2022 逆光世间 | 备案号: 京ICP备19016086号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式