MySQL:聚簇索引,辅助索引,回表查询,索引覆盖



聚集索引(clustered index)

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

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

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

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

辅助索引和回表查询

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

对比

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

  1. myisam的具体结构
    在这里插入图片描述
    2.innodb的具体结构
    在这里插入图片描述

索引覆盖

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

索引覆盖判断标准

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

如何实现索引覆盖?

可参考博文:
https://www.cnblogs.com/myseries/p/11265849.html
https://blog.csdn.net/b_x_p/article/details/86434387(比较详细)
常见的方法是:将被查询的字段,建立到联合索引里去。尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值