MySQL中索引的使用
1. 关于索引
在 MySQL 中,索引在存储引擎层实现
1.1. 使用索引的好处
- 大大减少存储引擎需要扫描的数据量
- 帮助我们进行排序,以避免使用临时表
- 可以把随机 I/O 改为顺序 I/O
1.2. 建立原则
- 适量,不是越多越好!!!
- 过多索引的影响
- 增加写操作的成本
- 增加查询优化器的选择时间
2. 索引方式
2.1. BTREE
特点
- 以
B+
的结构存储数据 - 加快数据的查询速度
- 更适合进行范围查找
- 以
适用场景
- 全值匹配的查询
- 匹配最左前缀的查询
- 匹配列前缀查询
- 匹配范围值的查询
- 精确匹配左前列并范围匹配另外一列
- 只访问索引的查询
限制
- 如果不是按照索引最左列开始查找,则无法使用索引
- 使用索引时不能跳过索引中的列
NOT IN
和<>
操作无法使用索引- 如果查询中有某个列的范围查询,则右边所有列都无法使用索引
2.2. HASH
特点
- 基于 Hash 表实现
- 只有查询调价精确匹配 Hash 索引中的所有列时,才能够使用到 Hash 索引
- 对于 Hash 索引中的所有列,存储引擎都会为每一行计算一个 Hash 码,Hash 索引中存储的就是 Hash 码。
适用场景
限制
- 必须进行二次查找:先 Hash 码定位到行,再找到具体数据
- 无法用于排序
- 不支持部分索引查找、也不支持范围查找
- Hash 码的计算可能存在 Hash 冲突
3. 建议
- 索引列上不能使用表达式或函数
- 建立联合索引时如何选择索引列的顺序
- 经常被使用到的列优先
- 选择性高的列优先
- 宽度小的列优先