MYSQL 索引原理

作者: 飞翔的鲲 | 来源:发表于2018-05-10 20:05 被阅读21次

参考
https://www.jianshu.com/p/e1dce41a6b2b

B+树


  • 结点中的关键字是子节点中的最小值


    image.png

索引分类(根据存储结构分)


  • 聚集索引&非聚集索引

数据库中的B+树索引可以分为聚集索引和辅助索引。
聚集索引的叶子结点存放的是一整行记录,
而辅助索引(二级索引)叶子节点上的数据是主键与具体记录(数据内容)。如果只需要查询索引列只,则不需要回表再查,这样就实现了覆盖索引。提高了查询效率。

下图形象说明了聚簇索引表(InnoDB)和非聚簇索引(MyISAM)的区别:

image.png
  • innodb引擎
    1.聚集索引(主键索引)
    2.辅助索引(二级索引)
    由于检索数据时,总是先获取到书签值(主键值),再返回查询,因此辅助索引也被称之为二级索引

索引分类(设置类型分)


参考 https://www.jianshu.com/p/331dd9eaa712

  • 主键索引(特殊的唯一索引,不能有空值的唯一索引)

  • 普通索引

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(不以通配符%或_开头的情形)。

相关文章

网友评论

    本文标题:MYSQL 索引原理

    本文链接:https://www.haomeiwen.com/subject/cofllftx.html