浅谈覆盖索引

337 阅读1分钟

前言

先说一下什么是覆盖索引

  • 覆盖索引是一种数据查询方式,不是索引类型
  • 在索引数据结构中,通过索引值可以直接找到要查询字段的值,而不需要通过主键值回表查询,那么就叫覆盖索引
  • 查询的字段被使用到的索引树全部覆盖到

应用场景

我们先建一个表

CREATE TABLE `order` (
  `id` int NOT NULL AUTO_INCREMENT,
  `orderNum` varchar(255) DEFAULT NULL,
  `phone` varchar(11) DEFAULT NULL,
	`pid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `IDX_ORDERNUM_PHONE` (`orderNum`,`phone`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们创建了一个存储引擎为InnoDB的表order,并设置id为主键,另外为orderNumphone创建了联合索引,最后向表中随机初始化了100W+条数据。

InnoDB会自动为主键id创建一棵名为主键索引(又叫做聚簇索引)的B+树,这个B+树的最重要的特点就是叶子节点包含了完整的用户记录。

如果我们执行一个sql查询

SELECT * FROM order WHERE orderNum = '123456';

1655436206465.jpg InnoDB存储引擎会根据搜索条件在该二级索引的叶子节点中找到orderNum123456的记录,但是二级索引中只记录了orderNumphone和主键id字段,因此InnoDB需要拿着主键id去主键索引中查找这一条完整的记录,这个过程叫做回表

我们再执行一个sql查询

SELECT phone FROM order WHERE orderNum = '123456';

1655436278597.jpg 可以看到Extra一列显示Using where;Using index,表示我们的查询内容在索引内,where条件为索引最左列,能够直接摒弃回表操作,大幅度提高查询效率。