B+树
-
结点中的关键字是子节点中的最小值
image.png
索引分类(根据存储结构分)
- 聚集索引&非聚集索引
数据库中的B+树索引可以分为聚集索引和辅助索引。
聚集索引的叶子结点存放的是一整行记录,
而辅助索引(二级索引)叶子节点上的数据是主键与具体记录(数据内容)。如果只需要查询索引列只,则不需要回表再查,这样就实现了覆盖索引。提高了查询效率。
下图形象说明了聚簇索引表(InnoDB)和非聚簇索引(MyISAM)的区别:

- innodb引擎
1.聚集索引(主键索引)
2.辅助索引(二级索引)
由于检索数据时,总是先获取到书签值(主键值),再返回查询,因此辅助索引也被称之为二级索引
索引分类(设置类型分)
-
主键索引(特殊的唯一索引,不能有空值的唯一索引)
-
普通索引
create table 'test' (
'id' bigint(32) not null AUTO_INCREMENT COMMIT '编号',
'name' VARCHAR(32), // 8, 16, 32
PRIMARY KEY ('id'),
UNIQUE KEY ('name'),
KEY ('name')
)
-
唯一索引 (与普通索引区别就加了个 unique)
唯一索引可以为空,但是空值只能有一个,主键不能为空。
普通唯一索引:单个字段上建立唯一索引,需要此字段所在的列上不能有重复的值,属于二级索引。
复合唯一索引:多个字段上联合建立唯一索引,属于二级索引。 -
单列索引、多列索引
多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。 -
复合索引(最左前缀)
平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:
–title,time
–title
注意:where and xxx and xxx and xxx 这种条件适合复合索引 -
全文索引
-
覆盖索引
定义:覆盖索引(covering index)指一个查询语句的执行只需要从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。也可以称之为实现了索引覆盖。
如果查询只需要扫描索引而无须回表,将带来诸多好处。
如select count(*), 这样结果不会回表查数据。不然需要到主键索引中拿数据。
覆盖索引就是从索引中直接获取查询结果,要使用覆盖索引需要注意select查询列中包含在索引列中;where条件包含索引列或者复合索引的前导列;查询结果的字段长度尽可能少。
(1)索引条目通常远小于数据行大小,如果只读取索引,MySQL就会极大地减少数据访问量。
(2)索引按照列值顺序存储,对于I/O密集的范围查询会比随机从磁盘中读取每一行数据的I/O要少很多。
(3)InnoDB的辅助索引(亦称二级索引)在叶子节点中保存了行的主键值,如果二级索引能够覆盖查询,则可不必对主键索引进行二次查询了。
- 支持SQL查询类型
MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。
网友评论