mysql联合索引为什么是最左匹配


为什么联合索引是从最左匹配

mysql创建联合索引的时候是从最左边的列先排序的,只有第一列相等的时候才会看第二列。所以肯定是从最左边开始匹配的。

什么是索引覆盖

如果需要查询的列直接在索引中,那么不需要回表查询聚簇索引中的行数据信息,则这种情况称为索引覆盖。组合索引更容易出现索引覆盖的情况。

  • 辅助索引不包含行数据的所有信息,故其大小远小于聚簇索引,因此可以减少大量的IO操作。
  • 索引覆盖只需要扫描一次索引树,不需要回表扫描聚簇索引树,所以性能比回表查询要高。
  • 索引中列值是按顺序存储的,索引覆盖能避免范围查询回表带来的大量随机IO操作。

如果判断一条sql语句是否用到索引覆盖?

用explain解析sql

Using index 就表示使用到了索引 , 并且所取的数据完全在索引中就能拿到,也就是用到了索引覆盖。

什么是索引下推

索引下推是索引下推是 MySQL 5.6 及以上版本上推出的,用于对查询进行优化。

索引下推是把本应该在 server 层进行筛选的条件,下推到存储引擎层来进行筛选判断,这样能有效减少回表。

举例说明:

首先使用联合索引(name,age),现在有这样一个查询语句:

select *  from t_user where name like 'L%' and age = 17;

这条语句从最左匹配原则上来说是不符合的,原因在于只有name用的索引,但是age并没有用到。

不用索引下推的执行过程:

  • 第一步:利用索引找出name带’L’的数据行:LiLei、Lili、Lisa、Lucy 这四条索引数据
  • 第二步:再根据这四条索引数据中的 id 值,逐一进行回表扫描,从聚簇索引中找到相应的行数据,将找到的行数据返回给 server 层。
  • 第三步:在server层判断age = 17,进行筛选,最终只留下 Lucy 用户的数据信息。

使用索引下推的执行过程:

  • 第一步:利用索引找出name带’L’的数据行:LiLei、Lili、Lisa、Lucy 这四条索引数据
  • 第二步:根据 age = 17 这个条件,对四条索引数据进行判断筛选,最终只留下 Lucy 用户的数据信息。(注意:这一步不是直接进行回表操作,而是根据 age = 17 这个条件,对四条索引数据进行判断筛选)
  • 第三步:将符合条件的索引对应的 id 进行回表扫描,最终将找到的行数据返回给 server 层。

比较二者的第二步我们发现,索引下推的方式极大的减少了回表次数。
索引下推需要注意的情况:

下推的前提是索引中有 age 列信息,如果是其它条件,如 gender = 0,这个即使下推下来也没用

开启索引下推:

索引下推是 MySQL 5.6 及以上版本上推出的,用于对查询进行优化。默认情况下,索引下推处于启用状态。我们可以使用如下命令来开启或关闭。

set optimizer_switch='index_condition_pushdown=off';  -- 关闭索引下推
set optimizer_switch='index_condition_pushdown=on';  -- 开启索引下推

参考

[1] mysql中的联合索引为什么要遵循最佳左前缀法则?



文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录