MySQL 联合索引 最左匹配原则 20
                 19-07-25 11:55
                 3528
                 1
                 赞
                 踩
                            
            建表语句:
CREATE TABLE `t_1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `f_1` varchar(255) DEFAULT NULL,
  `f_2` varchar(255) DEFAULT NULL,
  `f_3` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_fh` (`f_1`,`f_2`,`f_3`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;索引 index_fh 是f_1、f-2、f_3三个字段创建的联合索引。
根据最左匹配原则,
select * from abcd where f_1 = '1';
select * from abcd where f_1 = '1' and f_2 = '1';
select * from abcd where f_1 = '1' and f_2 = '1' and f_3 = '1';上面三个sql语句会使用索引 index_fh。
但是
select * from abcd where f_2 = '1';
select * from abcd where f_3 = '1';
select * from abcd where f_2 = '1' and f_3 = '1';应该不会使用索引,可是使用 explain 查看查询计划,仍然使用了索引。
+------+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+
| id   | select_type | table | type  | possible_keys | key      | key_len | ref  | rows | Extra                    |
+------+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+
|    1 | SIMPLE      | t_1  | index | NULL          | index_fh | 2304    | NULL |    1 | Using where; Using index |
+------+-------------+-------+-------+---------------+----------+---------+------+------+--------------------------+建表语句:
CREATE TABLE `t_2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `f_1` varchar(255) DEFAULT NULL,
  `f_2` varchar(255) DEFAULT NULL,
  `f_3` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_fh` (`f_2`,`f_3`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;建表语句和上面基本相同,只是索引使用了f_2、f_3两个字段,此时查询语句
建表语句和上面基本相同,只是索引使用了f_2、f_3两个字段,此时查询语句查看查询计划
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
|    1 | SIMPLE      | t_2   | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+没有使用索引。
为什么 select * from t_2 where f_3 = '1'; 在两个表中都不符合最左匹配原则,查询时一个使用了索引,一个没使用索引?
巧者劳智者忧,无能者无所求
                            
                 0 人点赞
            
                    请登录后发表评论
        
     
         
                 
                         
     
    
覆盖索引,如果加个字段f_4就不会走索引了。