你知道mysql索引有哪些吗?大家肯定都能霹雳啪啦地说出聚簇索引、主键索引、二级索引、普通索引、唯一索引、hash索引、B+树索引等等。
把所有类型的索引放在一起大家不便于理解,我们可以按照特性将索引可以大致的分一下类,我们可以按照两个角度来分类索引
- 按「数据结构」分类:B+tree索引、Hash索引、Full-text索引。
- 按「索引特点」分类:主键索引、唯一索引、普通索引、联合索引
重点介绍
本文着重围绕B+tree索引来介绍,其他的两种数据结构的索引赞不讨论。
B+tree其实是一种多叉树结构,叶子节点存放数据,非叶子节点只存放索引,
而且每个节点里的数据是按主键顺序存放的。每一层父节点的索引值都会出现在下层子节点的索引值中,因此在叶子节点中,包括了所有的索引值信息,并且每一个叶子节点都有两个指针,分别指向下一个叶子节点和上一个叶子节点,形成一个双向链表。如下图是主键索引B+tree结构
这种结构有什么优点呢?
- 相对于二叉树来说它更扁平,也意味查询数据产生的IO次数会更少,3-4层能轻松容纳千万级别数据
- 相对于B树结构,B+Tree 只在叶子节点存储数据,而 B 树 的非叶子节点也要存储数据,所以 B+Tree 的单个节点的数据量更小,在相同的磁盘 I/O 次数下,就能查询更多的节点。另外,B+Tree 叶子节点采用的是双链表连接,适合 MySQL 中常见的基于范围的顺序查找,而 B 树无法做到这一点。
索引特点
1.主键索引
主键索引就是建立在主键字段上的索引,通常在创建表的时候一起创建,一张表最多只有一个主键索引,索引列的值不允许有空值
2.唯一索引建
唯一索引建立在 UNIQUE 字段上的索引,一张表可以有多个唯一索引,索引列的值必须唯一,但是允许有空值
3.普通索引
普通索引就是建立在普通字段上的索引,既不要求字段为主键,也不要求字段为 UNIQUE
4.前缀索引
前缀索引是指对字符类型字段的前几个字符建立的索引,而不是在整个字段上建立的索引,前缀索引可以建立在字段类型为 char、 varchar、binary、varbinary 的列上。使用前缀索引的目的是为了减少索引占用的存储空间,提升查询效率
5.联合索引
通过将多个字段组合成一个索引,该索引就被称为联合索引,使用联合索引时,存在最左匹配原则,也就是按照最左优先的方式进行索引的匹配。在使用联合索引进行查询的时候,如果不遵循「最左匹配原则」,联合索引会失效,这样就无法利用到索引快速查询的特性了。常见的优化方式,将查询的列放到联合索引中可以避免回表来提升性能,注意这个查询列需要避免过长的字段,否则会导致索引文件过大降低IO性能