MySQL 索引

发布 : 2019-07-26 分类 : MySQL 浏览 :

MySQL 索引

单列索引

一个索引只包含一个列,一张表中可以包含多个单列索引。当我们查询一张表时,通常只会使用到一个 WHERE 条件,这时推荐使用单列索引。但是如果单列索引太多,会占用太多的空间,也会增加数据库写操作时的开销。

在使用多个WHERE条件进行查询时,MySQL优化器会选择最优索引策略,评估哪个索引效率最高和使用几个索引能完成查询,如果使用一个索引就能完成,那么就只使用那一个最佳索引(如果WHERE OR 条件查询,就会使用到多个索引了)。

联合索引

一个索引包含了多个列。如果大部分的查询场景的 WHERE 条件中都会使用到多个组合列,这时就应该使用组合索引。

优点

  • 减少开销:建立一个联合索引相比建立多个单列索引,使用更小的磁盘空间,并且减少数据库写操作时开销。
  • 覆盖索引:对于联合索引,如果查询的数据和查询条件都在联合索引的字段上,那么MySQL可以直接遍历索引取得数据,减少很多的I/O操作。
  • 效率高:索引的列越多,通过多个WHERE条件筛选出的数据就越少,效率就越高。

最左前缀匹配原则

建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

例如我们对 A、B、C三列建立联合索引 IDX_A_B_C
当我们进行查询时,WHERE条件中必须包含A列,这种情况下才会使用到联合索引,多个列的顺序可以是任意的,比如A AND B 或者 B AND A 两种情况都会使用到索引,因为MySQL的查询优化器EXPLAIN会对查询条件中的字段进行排序,即便这样,还是推荐我们编写SQL的时候按照联合索引的顺序排列WHERE条件。

测试

  1. WHERE A 联合索引有效
  2. WHERE B 联合索引无效
  3. WHERE C 联合索引无效
  4. WHERE A AND B 联合索引有效
  5. WHERE A AND C 联合索引有效
  6. WHERE B AND A 联合索引有效
  7. WHERE A AND B AND C 联合索引有效
  8. WHERE B AND C 联合索引无效
  9. WHERE A OR B 联合索引无效
本文作者 : 王海
原文链接 : https://blog.whai.me/2019/07/26/mysql-index/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
留下足迹