MYSQL 索引原理

参考
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(不以通配符%或_开头的情形)。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的...
    北山学者阅读 444评论 0赞 1
  • MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但...
    凌乱秋天阅读 780评论 0赞 6
  • MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但...
    刘振锋阅读 2,216评论 5赞 50
  • 本文转自美团技术团队感谢提供这么棒的文章 MySQL凭借着出色的性能++、低廉的成本、丰富的资源,已经成为绝大多数...
    抓兔子的猫阅读 684评论 0赞 10
  • MySQL索引原理 索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需...
    Ddaidai阅读 529评论 0赞 1

友情链接更多精彩内容