目录

  • 聚集索引(clustered index)
  • 辅助索引和回表查询
  • 对比
  • 索引覆盖
  • 索引覆盖判断标准
  • 如何实现索引覆盖?




聚集索引(clustered index)

也叫聚簇索引,是一种数据存储方式(将索引和数据存储在一起),是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。B+树将数据存储与索引放到了一块,找到索引也就找到了数据,InnoDB聚集索引的叶子节点存储行记录,因此, InnoDB必须要有,且只有一个聚集索引:

(1)如果表定义了主键PK,则PK就是聚集索引;

(2)如果表没有定义PK,则第一个非空唯一键not NULL unique列是聚集索引;

(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;

辅助索引和回表查询

innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值。简记为,第一次找到主键值,第二次根据主键值找到行数据
  Innodb辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。
  辅助索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个辅助索引。在innodb中有时也称辅助索引为二级索引,该方法存在回表查询(根据查询到的辅助索引叶子节点的主键值,再次查找数据,它的性能较扫一遍索引树更低)。

对比

在myisam中,不管是不是主键,还是普通索引,叶子节点上保存的都是数据的物理磁盘的引用地址,当查询到这个引用地址,就可以将这份数据加载到内存。在innodb中,使用的就是上面的聚簇索引, 在主键(或者系统默认的隐式一个主键索引)的叶子节点上, 保存的是数据行的真实信息. 其他索引(辅助索引)的叶子节点都是这个主键索引的关键字的值。

mysql的聚集索引 mysql 聚集索引_mysql的聚集索引

  1. myisam的具体结构

    2.innodb的具体结构

索引覆盖

MySQL可以使用索引直接获取列的数据,这样就不需要进行读取数据行,如果索引树的叶子节点已经包含要查询的数据(即在一棵索引树上就能获取SQL所需的所有列数据)就称之为索引覆盖,无需回表查询,速度更快。

索引覆盖判断标准

使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。