正文
虽然,创建了相关列的索引,感觉万事具备,仅差上线了。但是,在SQL语句执行的过程中,你创建的索引并不一定使用,这是因为MySQL在执行SQL语句的时候,会按照自己的理解优化你写的SQL。
讲今天的故事之前,先创建2个表,如下:
CREATE TABLE `score` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(20) DEFAULT NULL COMMENT '课程名字', `score` decimal(20, 6) DEFAULT NULL COMMENT '分数', PRIMARY KEY (`id`), KEY `idx_name` (`name`) ) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
CREATE TABLE `course` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(20) DEFAULT NULL COMMENT '课程名字', `note` varchar(50) DEFAULT NULL COMMENT '课程笔记', PRIMARY KEY (`id`), KEY `idx_name` (`name`), KEY `idx_note` (`note`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
需求往往是很特殊,你就想使用自己创建的索引,那应该怎么做呢?MySQL为我们提供了一个关键字force,可以强制使用已经创建好的索引。查询SQL如下所示:
explain select * from `course` left join score on score.id = course.id order by course.name desc;
上面查询分析的结果,发现查询并没有使用索引:
强制使用索引执行:
explain select * from `course` force index (idx_name) left join score on score.id = course.id order by course.name desc;
强制使用索引后,发现查询结果集合的时候,使用了自己定义的索引。
强制使用索引一定会生效吗?
答案是否定的,并不一定会生效,比如下面的语句:
explain select * from `course` force index (idx_name) where name like '%m%';
虽然强制地使用了索引,但是经过分析,这次查询还是没有使用索引,所以强制使用索引并不一定是生效的。如果强制不想使用索引应该怎么办呢?
explain select * from `course` where name like 'm%';
上图中,展现了,在查询返回结果时候,使用了自己定义的索引。如果不想使用索引,可以使用ignore来忽略索引带来的影响。
explain select * from `course` ignore index (idx_name) where name like 'm%';
综上,强制使用索引,在一定的范围是有效的,加上并不一定使用索引。如果不想使用索引,可以使用ignore index方式不使用索引。