(03)索引

1. 概念

索引底层存储用的B+树

一张表中有2个索引,那就会有2个B+树。(索引就是B+树存储的,可以理解为索引就是B+树)

什么是B+树?参考连接
https://cloud.tencent.com/developer/article/1681803

特殊情况:mysql的 memery 存储引擎使用的是hash表存储,而不是B+树。InnoDB、MyISAM
的索引结构是 B+树索引

注意:使用索引时,尽可能的使用长度较小的列

2. 索引分类

2.1. 主键索引

建表时,mysql会自动为主键创建索引。主键索引属于特殊的唯一索引,不能为空值,且每张表只能有一个主键索引

2.2. 唯一索引

ALTER TABLE table_name ADD UNIQUE (column)

唯一索引允许空值,一张表中可以有多个唯一索引

1.主键一定是唯一性索引,唯一性索引并不一定就是主键;
2.一个表中可以有多个唯一性索引,但只能有一个主键;
3.主键列不允许空值,而唯一性索引列允许空值;

2.3. 组合索引

ALTER TABLE table_name ADD INDEX index_name (column1,column2,...)

使用组合索引时,需要注意组合索引的顺序

2.3.1. 案例

建立组合索引(a,b,c)
ALTER TABLE table_name ADD INDEX index_name (a,b,c)

执行上边sql语句,相当于建立了a、ab、abc三个索引
一个索引顶三个索引是好事。如果不使用联合索引,而是单独建立3个索引,那么每多一个索引都会增加写操作的开销和磁盘空间的开销

会存在覆盖索引。有如下sql
select a,b,c from table where a=1and b = 2。
那么MySQL可以直接通过遍历索引取得数据,而无需回表查询,这减少了很多的随机io操作

组合索引匹配越多,筛选数据越快。
假设一张表中,有1000w条数据,a=1的数据占10%,b=2的数据占10%,c=3的数据占10%

不使用联合索引,把a,b,c拆分为3个单独索引,有如下sql
select * from table where a = 1 and b =2 and c = 3。
检索次数为1000W*10%=100w ,然后再回表从100w条数据中找到符合b=2 and c= 3的数据。

使用联合索引,(a,b,c)为一个整体。有如下sql
select * from table where a = 1 and b =2 and c = 3。
检索次数为1000w *10% *10% *10%=1w

3. 聚簇索引/二级索引/非聚簇索引

聚簇索引/二级索引/非聚簇索引 不是单独的索引类型,而是一种数据存储方式

3.1. 聚簇索引

InnoDB主键id索引类型为聚簇索引

聚簇索引就是把InnoDB引擎表的主键构造一颗B+树,同时叶子节点(最底层节点)中存放的就是整张表的行记录数据
说白了聚簇索引的叶子节点存放的是主键值+数据行

假设user表id为主键,数据库类型为InnoDB,那么建表时MySql会自动为主键id创建聚簇索引,如下图

(03)索引

3.2. 二级索引

聚簇索引的叶子节点存放的是主键值+数据行,二级索引的叶子节点存放的是索引值+主键值

如果我手动创建一个普通索引ALTER TABLE user ADD INDEX in_name (name),那么name这个索引的数据结构如下图
(03)索引

3.3. 非聚簇索引

MyISAM主键id索引类型为非聚簇索引

非聚簇索引就是把MyISAM引擎表的主键构造一颗B+树,非聚簇索引将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
说白了非聚簇索引的叶子节点存放的是主键值+数据行所在地址

假设user表id为主键,数据库类型为MyISAM,那么建表时MySql会自动为主键id创建非聚簇索引,如下图

(03)索引

上一篇:03-Java基础01


下一篇:03-2Java数据类型和运算符