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. 建议

  • 索引列上不能使用表达式或函数
  • 建立联合索引时如何选择索引列的顺序
    • 经常被使用到的列优先
    • 选择性高的列优先
    • 宽度小的列优先