概念
以下讲解均为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(*)来统计全表。