MySQL索引
MySQL的索引分类
## 数据结构层次 索引建立后也会在磁盘生成索引文件,那每个具体的索引节点该如何在本地文件中存放呢?这点是由索引的数据结构来决定的。比如索引的底层结构是数组,那所有的索引节点都会以Node1→Node2→Node3→Node4....这样的形式,存储在磁盘同一块物理空间中,不过MySQL的索引不支持数组结构,或者说数组结构不适合作为索引结构,MySQL索引支持的数据结构如下: - B+Tree类型:MySQL中最常用的索引结构,大部分引擎支持,有序。 - Hash类型:大部分存储引擎都支持,字段值不重复的情况下查询最快,无序。 - R-Tree类型:MyISAM引擎支持,也就是空间索引的默认结构类型。 - T-Tree类型:NDB-Cluster引擎支持,主要用于MySQL-Cluster服务中。 在上述的几种索引结构中,B+tree和哈希索引是最常见的索引结构,几乎大部分存储引擎都实现了,对于后续两种索引结构在某些情况下也较为常见,但除开列出的几种索引结构外,MySQL索引支持的数据结构还有R+、R*、QR、SS、X树等结构。 但为何后续的一些索引结构大家没听说过呢?这是因为索引到底支持什么数据结构,这是由存储引擎决定的,不同的存储引擎支持的索引结构也并不同,目前较为常用的引擎就是MyISAM、InnoDB,因此大家未曾听说后面列出的这些索引结构也是正常的。 在MySQL中创建索引时,其默认的数据结构就为B+Tree,如何更换索引的数据结构呢?如下: ```sql CREATE INDEX indexName ON tableName (columnName(length) [ASC|DESC]) USING HASH; ``` 也就是在创建索引时,通过USING关键字显示指定索引的数据结构(必须要为当前引擎支持的结构)。 同时索引会被分为有序索引和无序索引,这是指索引文件中存储索引节点时,会不会按照字段值去排序。那一个索引到底是有序还是无序,就是依据数据结构决定的,例如B+Tree、R-Tree等树结构都是有序,而哈希结构则是无序的。 ## 字段数量层次 从表字段的层次来看,索引又可以分为单列索引和多列索引,这两个称呼也比较好理解,单列索引是指索引是基于一个字段建立的,多列索引则是指由多个字段组合建立的索引。 单列索引也会分为很多类型,比如: - 唯一索引:指索引中的索引节点值不允许重复,一般配合唯一约束使用。 - 主键索引:主键索引是一种特殊的唯一索引,和普通唯一索引的区别在于不允许有空值。 - 普通索引:通过KEY、INDEX关键字创建的索引就是这个类型,没啥限制,单纯的可以让查询快一点。 - .....还有很多很多,只要是基于单个字段建立的索引都可以被称为单列索引。 多列索引的概念前面解释过了,不过它也有很多种叫法,例如: - 组合索引、联合索引、复合索引、多值索引.... 但不管名称咋变,描述的含义都是相同的,即由多个字段组合建立的索引。 但无论是单列还是多列,都可以存在一个前缀索引的概念,啥叫前缀索引呢?还记得创建索引时指定的length字段吗? - length:如果字段存储的值过长,选用值的前多少个字符创建索引。 使用一个字段值中的前N个字符创建出的索引,就可以被称为前缀索引,前缀索引能够在很大程度上,节省索引文件的存储空间,也能很大程度上提升索引的性能, ## 功能逻辑层次 以功能逻辑划分索引类型,这也是最常见的划分方式,从这个维度来看主要可划分为五种: - 普通索引、唯一索引、主键索引、全文索引、空间索引 对于普通索引、唯一索引、主键索引都介绍过了,就不再过多阐述,但稍微提一嘴,在主键字段上建立的索引被称为主键索引,非主键字段上建立的索引一般被称为辅助索引或、二级索引或次级索引,接着重点聊一下全文索引和空间索引。 全文索引和空间索引都是MySQL5.7版本后开始支持的索引类型,不过这两种索引都只有MyISAM引擎支持,其他引擎要么我没用过,要么就由于自身实现的原因不支持,例如InnoDB。对于全文索引而言,其实在MySQL5.6版本中就有了,但当时并不支持汉字检索,到了5.7.6版本的时候才内嵌ngram全文解析器,才支持亚洲语种的分词,同时InnoDB引擎也开始支持全文索引,在5.7版本之前,只有MyISAM引擎支持。 ##### 全文索引 全文索引类似于ES、Solr搜索中间件中的分词器,或者说和之前常用的like+%模糊查询很类似,它只能创建在CHAR、VARCHAR、TEXT等这些文本类型字段上,而且使用全文索引查询时,条件字符数量必须大于3才生效。 ##### 空间索引 空间索引这玩意儿其实用的不多,至少大部分项目的业务中不会用到,想要弄清楚空间索引,那么首先得知道一个概念:GIS空间数据,GIS是什么意思呢?是地理信息系统,这是一门新的学科,基于了计算机、信息学、地理学等多科构建的,主要就是用于管理地理信息的数据结构,在国土、规划、出行、配送、地图等和地理有关的项目中,应用较为频繁。 地理空间数据主要包含矢量数据、3D模型、影像文件、坐标数据等,说简单点,空间数据也就是可以将地理信息以模型的方式,在地图上标注出来。在MySQL中总共支持GEOMETRY、POINT、LINESTRING、POLYGON四种空间数据类型,而空间索引则是基于这些类型的字段建立的,也就是可以帮助我们快捷检索空间数据。 ## 存储方式层次 从存储方式来看,MySQL的索引主要可分为两大类: - 聚簇索引:也被称为聚集索引、簇类索引 - 非聚簇索引:也叫非聚集索引、非簇类索引、二级索引、辅助索引、次级索引 重点说一说这两类索引存储方式的区别,在说之前先回忆一下数组和链表的区别: - 数组是物理空间上的连续,存储的所有元素都会按序存放在同一块内存区域中。 - 链表是逻辑上的连续,存储的所有元素可能不在同一块内存,元素之间以指针连接。 为啥要说这个呢?因为聚簇索引和非聚簇索引的区别也大致是相同的: - 聚簇索引:逻辑上连续且物理空间上的连续。 - 非聚簇索引:逻辑上的连续,物理空间上不连续。 当然,这里的连续和数组不同,因为索引大部分都是使用B+Tree结构存储,所以在磁盘中数据是以树结构存放的,所以连续并不是指索引节点,而是指索引数据和表数据,也就是说聚簇索引中,索引数据和表数据在磁盘中的位置是一起的,而非聚簇索引则是分开的,索引节点和表数据之间,用物理地址的方式维护两者的联系。 不过一张表中只能存在一个聚簇索引,一般都会选用主键作为聚簇索引,其他字段上建立的索引都属于非聚簇索引,或者称之为辅助索引、次级索引。但也不要走进一个误区,虽然MySQL默认会使用主键上建立的索引作为聚簇索引,但也可以指定其他字段上的索引为聚簇索引,一般聚簇索引要求索引必须是非空唯一索引才行。 其实就算表中没有定义主键,InnoDB中会选择一个唯一的非空索引作为聚簇索引,但如果非空唯一索引也不存在,InnoDB隐式定义一个主键来作为聚簇索引。 当然,主键或者说聚簇索引,一般适合采用带有自增性的顺序值。
顶部
收展
底部
[TOC]
目录
MySQL索引机制概述
MySQL的索引分类
MySQL索引的创建使用方式
MySQL各索引的优劣分析
MySQL索引失效
MySQL 正确建立索引
MySQL 正确使用索引
相关推荐
MySQL教程
MySQL命令
MySQL事务
MySQL锁机制
MySQL版本特性