结论:包含or时,需要有一个索引包含了所有where用到的字段,这个索引才会生效。否则索引不生效。
建表语句
CREATE TABLE `course` (
`cno` varchar(20) NOT NULL,
`cname` varchar(10) NOT NULL,
`tno` varchar(20) NOT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`cno`),
KEY `cname` (`cname`) USING BTREE,
KEY `tno` (`tno`) USING BTREE,
KEY `age` (`age`) USING BTREE,
KEY `tow` (`cname`,`tno`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如下tow索引能生效
SELECT tno,cname from course WHERE tno = "804" or tno = "805";
如下三种情况tow索引能生效
SELECT tno,cname from course WHERE tno = "804" or cname="操作系统";
SELECT tno,cname from course WHERE tno = "804" or tno = "805" and cname="操作系统";
SELECT tno,cname from course WHERE cname="操作系统" or cname="操作" and tno = "804";
如下sql索引不生效,因为没有一个索引包含了所有where用到的字段。
SELECT tno,cname from course WHERE cname="操作系统" or age=23 and tno = "804";
SELECT tno,cname from course WHERE cname="操作系统" or tno = "804" and age=23;