or连接条件字段,全部设置索引的时候,才会使用索引,否则将不会使用索引。
验证如下:
数据表结构如下
create TABLE book
(
bookid INT NOT NULL primary key auto_increment,
bookname VARCHAR(255) NOT NULL ,
authors VARCHAR(255) NOT NULL,
info VARCHAR(255) NULL,
comment VARCHAR(255) NULL,
year_publication YEAR NOT NULL,
INDEX(year_publication),
INDEX(bookname)
);
测试数据如下
INSERT `book` (`bookname`,`authors`,`info`,`comment`,`year_publication`) VALUES
('平凡的世界','路遥','加油','平凡的世界不平凡的人','1986'),
('活着','余华','加油','活着就有希望不平凡的人','1986'),
('平凡的世界','路遥','加油','平凡的世界不平凡的人','1986'),
('活着','余华','加油','活着就有希望不平凡的人','1986'),
('平凡的世界','路遥','加油','平凡的世界不平凡的人','1986'),
('活着','余华','加油','活着就有希望不平凡的人','1986'),
('平凡的世界','路遥','加油','平凡的世界不平凡的人','1986'),
('活着','余华','加油','活着就有希望不平凡的人','1986'),
('平凡的世界','路遥','加油','平凡的世界不平凡的人','1986'),
('活着','余华','加油','活着就有希望不平凡的人','1986')
使用explain来分析sql语句:
EXPLAIN SELECT * FROM test.book WHERE `bookid`=1 OR `authors`='路遥';
bookid 主键索引,authors没有索引,最终没有使用索引。
2.EXPLAIN SELECT * FROM test.book WHERE `bookid`=1 OR `bookname`='平凡的世界';
bookid主键索引,bookname普通索引,最终两个索引,type为index_merge,其实是将查询出的结果取并集。