MySQL的where子句中or导致索引失效,以及包含or时能使索引生效的情况

结论:包含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;

猜你喜欢

转载自blog.csdn.net/weixin_43073775/article/details/118466301