问题描述
给出下表:@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会选择限制最严格的列上的索引-即选择最少行的索引。
但是对于您的查询,您需要一个索引,该索引具有三列b
,c
和d
的任意顺序。
对于
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,
大部分没用。