关于最左前缀原则“失效”的理解
问题背景
覆盖索引
问题描述
看上去,违反了最左前缀原则,但却使用了覆盖索引。😵
问题分析
根据最左前缀原则,在创建覆盖索引(name,ip,port)时,MySQL 其实维护了 3 个索引:name、name,port 和 name,ip,port。
因为这条查询中需要查询的列为 name,ip,port,但是 where 中只有 ip 和 port,按照最左前缀原则无法命中覆盖索引的任何一种情况,但是使用(name,ip,port)覆盖索引的非聚簇索引树可以达到覆盖索引的效果,所以对于 MySQL 来说,此时有两种选择,一种是扫描主键的聚簇索引树,另一种是扫描(name,ip,port)覆盖索引的非聚簇索引树。MySQL 的优化器会选择预期开销更小的方案,因此 MySQL 选择了全扫描覆盖索引树。