前言
前面啰嗦了一大堆,也没有正式的开始介绍索引,下面我们开始索引的真正学习,上文说到了索引的主要目的是为了加速查询存在的,以及InnDB
的数据页结构,下面我们具体来分析下索引都哪些特点,具体数据是怎么存储的。
索引的分类
-
聚簇索引
聚集索引就是叶子节点的顺序和物理存储的顺序是一样的,所以范围查找的时候效率很高,但是DML操作的时候,为了维护物理存储的顺序和叶子节点一样,涉及到大量的数据位移调整
在
InnoDB
中指的就是主键索引 -
联合索引
多个 列组合在一起,专门用于组合搜索,效率高于索引的合并(多个单列索引组合搜索)
-
唯一索引
加速查询,列值是唯一
-
普通索引
就是指普通的字段,仅仅能加速查询
-
全文索引
一般情况下很少用,主要用于查找文本中的关键字,
InnoDB
从5.6版本已经开始支持。(不够友好,默认不支持中文,日文,需要其他的插件辅助)互联网应用倾向于用其他的方案解决如Es(主要是字符的文本进行截取,分词)
常用创建索引的方法
MySQL
目前主要支持 FULLTEXT
,HASH
,BTREE
,RTREE
.
MySql
索引的数据结构选型,InnoDB
默认采用B+Tree作为索引的数据结构
-
FULLTEXT
针对较大的数据,只有文本类型的字段可以创建索引,比如char/varchar/text
;这个索引并不是 -
Hash
时间复杂度为O(1),基于hash表来实现,不支持范围查找。只针对精确匹配索引的所有列的查询才会生效,针对每一行的数据,存储引擎都会对所有的索引列计算一个hash code,并将hash code存储在索引中,指针指向数据行指针。(另外InnoDB
引擎中有一个特殊的功能叫做自适应哈希索引,当InnoDB
发现某些做索引值被使用的非常频繁的时候,会基于B-Tree
索引的基础上再创建一个hash索引,这样可以利用一些hash索引的遍历。加快索引数据的查找) -
B-Tree
索引是MySQL
数据库中使用最频繁的索引,除了Archive
存储引擎外其他的所有存储引擎都支持B-Tree
索引,实际上在很多其他的数据库管理系统中B-Tree
索引也是最重要的索引,主要是因为B-Tree
索引的数据结构在数据检索中表现非常优异。-
一般来说
B-Tree
索引的物理文件是以平衡树的结构来存储的,也就是所有的实际需要的数据都存放于树的结点,一个树节点可以存多个数据。 -
相对于普通的二叉树索引,由于一个树的节点,可以保存多个数据,缩小了树的深度。
B-Tree
的平衡是通过向下分裂来实现,避免查找的时候会退化成链表进行查找,增加查找的时间复杂度。 -
在
MySQL
数据库中,BTree
是MyISAM
数据引擎在使用。
-
-
B+Tree
是B-Tree
的变种,所有的数据都存储在叶子节点上,并且增加了顺序访问的指针,每个叶子节点的指针指向相邻的叶子节点的地址。相对B-Tree
来说,进行范围查找两个节点,进行遍历既可,相对而言,B-Tree</