# MySQL中索引

## 索引的存储分类

* B-Tree索引：最常见的索引类型，大部分引擎都支持B树索引，底层数据结构使用B+树
* Hash索引：Memory、Heap引擎支持，使用场景简单。
* R-Tree索引（空间索引）：空间索引是MyISAM的一个特殊索引类型，主要用于地理空间数据类型，通常使用较少。
* Full-Text（全文索引）：全文索引也是MyISAM的一个特殊索引类型，支持char、varchar、text列，InnoDB从MySQL5.6版本开始提供对全文索引的支持。

## 设计索引的原则

* 经常会被使用到的列优先
* 选择性高的列优先
* 合理建立索引，索引并不是越多越好
* 尽量使用短索引
* 更新十分频繁、数据区分度不高的字段上不宜建立索引
* 建立索引的列，不允许为null
* 单表索引建议控制在5个以内
* 单索引字段数不允许超过5个

## 索引失效

Hash索引：

* 只用于使用=或<=>操作符的等式比较，只适用于key-value查询
* Hash索引不适用于范围查询，例如<、>、<=、>=这类操作

B-Tree索引：

* 以%开头的LIKE查询不能利用B-Tree索引
* 数据类型出现隐式转换的时候也不会使用索引，特别是当列类型是字符串，要将字符串用引号引起来索引才生效
* 复合索引的情况下，假如查询条件不包含索引列最左边部分，即不满足最左原则，是不会使用复合索引的，右边可以没有，左边和中间不能缺
* 如果MySQL估计使用索引比全表扫描更慢，则不使用索引
* 用or分割开的条件，每一列都要有索引才能使用索引

## 推荐阅读

[https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/MySQL Index.md](https://github.com/Snailclimb/JavaGuide/blob/master/docs/database/MySQL%20Index.md) <https://juejin.cn/post/6844903645125820424>
