mysql索引使用指南
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 | create index index_name on tablename(column); |
建立索引使用的字段数量
根据建立索引时使用的字段数量,可以分为单列索引
和多列索引
。
单列索引
可以分为以下几种:
唯一索引
:唯一索引的索引值不允许重复主键索引
:一种特殊的唯一索引,同时不允许空值普通索引
- …
由多个字段组合创建的索引就是组合索引。
按照功能逻辑分类
普通索引
主键索引
唯一索引
全文索引
全文索引
的原理有些类似于ES等搜索引擎
,建立的过程中会对文本字段进行分词
。,在mysql中,我们对文本进行搜索时会使用like
字段来进行模糊匹配,当时当通配符%
置于待匹配字符串前时索引会失效,例如%test
。此时搜索的效率会大大较低,全文索引在这种情况下会起到较大的作用。
按照储存层次
主要分为聚簇索引和非聚簇索引两种,两者的区别主要是数据是否存放在索引节点中。
聚簇索引
:逻辑上连续且物理空间上的连续。非聚簇索引
:逻辑上的连续,物理空间上不连续。
什么意思呢,我们知道一个索引就是一颗B+树,如果真实数据储存在这个B+的节点中,就是聚簇索引,也就是物理空间上的连续。
而非聚簇索引与之相对,并不会储存真正的数据,而是储存指向数据的指针
。
我们以innodb和myisam为例,innodb的的主键索引
使用了聚簇索引
,myisam
使用了非聚簇索引
,这一点我们在它们的文件组织形式上就可以看出来他们的区别。
索引的使用方式
未完待续…