聚簇索引和非聚簇索引

834 阅读2分钟

概念

以下讲解均为Innodb索引

1、聚簇索引

索引的叶子节点即为行数据

1)默认主键索引就是聚簇索引

2)若没有主键索引则用一个唯一且不为空的索引列成为聚族索引

3)若唯一且不为空的索引也不存在,Innodb会隐式定义一个主键作为聚簇索引。

2、非聚簇索引

索引的叶子节点是主键值

其他索引如普通索引、前缀索引等为非聚族索引。

3、索引数据结构

CREATE TABLE person (
	`id` INT(11) NOT NULL,
	`name` VARCHAR(32) NULL DEFAULT NULL,
	`date` TIMESTAMP NOT NULL,
	PRIMARY KEY (`id`),
	INDEX `index_name` (`name`)
);

表数据结构如下图(网上copy的图,偷个懒):

4、查找过程

1)聚族索引查找过程

直接根据聚族索引找到叶子节点上的数据

2)非聚族查找过程

根据非聚族索引先找到主键值(注意这里找到的是主键值,不是主键的地址),再根据主键值查找聚族索引找到数据

5、回表查询

因为非聚族索引要扫描两次索引,所以效率会更低,这种查找也叫回表查询。

6、索引覆盖程

索引覆盖:只需要在一棵索引树上就能获取所有列数据,无需回表,称为索引覆盖。

索引覆盖方法:针对被查询的字段,建立索引或者联合索引。提高查询效率。

7、索引覆盖优化sql

哪些场景可以利用索引覆盖来优化sql:

1)指定查询某个或者某几个列

只查询所需要的列(列上已建索引),不要使用select *来查询出所有的列数据。

2)全表count查询

使用select count(col name),不要使用select count(*)来统计全表。