程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。个人公众号《代码废柴》欢迎关注。
一、背景
在使用MySQL等等各大数据库中,已经创建了相关列的索引,感觉万事俱备,仅仅距离上线一步之遥。但是,在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`)
) ENGIN=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;
上面查询分析的结果,发现查询并没有使用索引:
强制使用索引执行,可以采用force index实现:
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 index来忽略索引带来的影响。
explain
select *
from `course` ignore index (idx_name)
where name like 'm%';
综上,强制使用索引,在一定的范围是有效的,加上并不一定使用索引。如果不想使用索引,可以使用ignore index方式不使用索引。
程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。个人公众号《代码废柴》欢迎关注。