mysql索引概述

在我们正式开始讲索引之前,我们不妨回想一个场景,当我们使用字典的时候,我们并不会直接去整本书去检索内容,而是先去查找目录,根据目录给我们提供的页码,在从字典中查询信息,索引就类似于字典中的目录,可以大大提高数据检索的效率。

mysql的索引机制是mysql提供给我们的一个超强的功能,正确的索引可以大大提高mysql检索的速度和效率。

索引本质

如果了解过数据结构或者数据库的底层,那么一定知道mysql索引的底层是基于B+树的,那就是说所谓索引其实就是B+树,对某一个字段建立索引就是以这个字段为关键字建立B+树,这棵B+树会被保存在mysql的文件中,具体的文件会根据引擎的不同而不同,以最常用的innodb和myiasm为例:

myisam:

  • tablename_myisam_index.frm:该文件中存储表的结构信息。
  • tablename_myisam_index.MYD:该文件中存储表的行数据。
  • tablename_myisam_index.MYI:该文件中存储表的索引数据。

innodb:

  • tablename_innodb_index.frm:该文件中存储表的结构信息。
  • tablename_innodb_index.ibd:该文件中存储表的行数据和索引数据。

不同的引擎对数据的处理方式不同,保存数据的方式也不同,对于myisam来说,很明显可以发现它的索引文件和数据文件是不存放在一起的,而innodb把数据和索引放在一起,这里是涉及到的是两者之间索引类型的区别,innodb使用的是聚簇索引,myisam使用的非聚簇索引,这里不予详细介绍。

说的简单粗暴一点,一个索引对应一个B+树。

索引的分类和创建

索引的类型有很多,从不同的维度我们可以有很多分类,下面讲分别介绍他们并介绍它们的基本用法。

从使用的数据结构区分

最常用的有两种索引:

  • B+Tree类型:MySQL中最常用的索引结构,大部分引擎支持,有序。
  • Hash类型:大部分存储引擎都支持,字段值不重复的情况下查询最快,无序。
1
2
create index index_name on tablename(column);
create index hash_index_name using hash on tablename(column);

建立索引使用的字段数量

根据建立索引时使用的字段数量,可以分为单列索引多列索引

单列索引可以分为以下几种:

  • 唯一索引:唯一索引的索引值不允许重复
  • 主键索引:一种特殊的唯一索引,同时不允许空值
  • 普通索引

由多个字段组合创建的索引就是组合索引。

按照功能逻辑分类

  • 普通索引
  • 主键索引
  • 唯一索引
  • 全文索引

全文索引的原理有些类似于ES等搜索引擎,建立的过程中会对文本字段进行分词。,在mysql中,我们对文本进行搜索时会使用like字段来进行模糊匹配,当时当通配符%置于待匹配字符串前时索引会失效,例如%test。此时搜索的效率会大大较低,全文索引在这种情况下会起到较大的作用。

按照储存层次

主要分为聚簇索引和非聚簇索引两种,两者的区别主要是数据是否存放在索引节点中。

  • 聚簇索引:逻辑上连续且物理空间上的连续。
  • 非聚簇索引:逻辑上的连续,物理空间上不连续。

什么意思呢,我们知道一个索引就是一颗B+树,如果真实数据储存在这个B+的节点中,就是聚簇索引,也就是物理空间上的连续。

而非聚簇索引与之相对,并不会储存真正的数据,而是储存指向数据的指针

我们以innodb和myisam为例,innodb的的主键索引使用了聚簇索引myisam使用了非聚簇索引,这一点我们在它们的文件组织形式上就可以看出来他们的区别。

索引的使用方式

未完待续…