该语句将使用哪个普通索引

问题描述

给出下表:@H_502_1@

CREATE TABLE `test` (
  `a` int(255) unsigned NOT NULL AUTO_INCREMENT,`b` varchar(64) NOT NULL DEFAULT '',`c` varchar(32) NOT NULL DEFAULT '',`d` varchar(32) NOT NULL DEFAULT '',PRIMARY KEY (`a`),KEY `b` (`b`) USING BTREE,KEY `c` (`c`(19)) USING BTREE,KEY `d` (`d`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='test';

insert test(a,b,c,d) values('1','1','1');
insert test(a,d) values('2','2',d) values('3','3',d) values('4','4','1');

我不知道以下sql使用哪个索引,但是我知道Innodb引擎仅使用一个索引。@H_502_1@

explain select * from test where b='2' and c='2' and d='2';

我在MysqL数据库中执行了上述sql,然后此语句使用了'b index'。这里有什么规定吗?还是有针对优化程序的任何规则,但都在这里使用?@H_502_1@

解决方法

从理论上讲,MySQL会选择限制最严格的列上的索引-即选择最少行的索引。

但是对于您的查询,您需要一个索引,该索引具有三列bcd的任意顺序。

,

对于

where b='2' and c='2' and d='2';

INDEX(b,c,d) -- with the columns in any order

另一个问题。没有正当理由,请勿使用“前缀”索引:

  KEY `c` (`c`(19)) USING BTREE,

大部分没用。

以下是一些准则http://mysql.rjweb.org/doc.php/index_cookbook_mysql