0
点赞
收藏
分享

微信扫一扫

SQL语句如何强制使用索引?

程序员冈刀,目前就职于美团,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;

上面查询分析的结果,发现查询并没有使用索引:

SQL语句如何强制使用索引?_MySQL

强制使用索引执行,可以采用force index实现:

explain
select *
from `course` force index (idx_name)
         left join score
on score.id = course.id
order by course.name desc;

SQL语句如何强制使用索引?_SQL_02

强制使用索引后,发现查询结果集合的时候,使用了自己定义的索引。

三、强制使用索引一定会生效吗?

答案是否定的啦,并不一定会生效,比如下面的语句:

explain
select *
from `course` force index (idx_name)
where name like '%m%';

SQL语句如何强制使用索引?_sql_03

虽然强制地使用了索引,但是经过分析,这次查询还是没有使用索引,所以强制使用索引并不一定是生效的。如果强制不想使用索引应该怎么办呢? 如下的语句默认就是使用定义好的索引了:

explain
select *
from `course`
where name like 'm%';

SQL语句如何强制使用索引?_sql_04

上图中,展现了,在查询返回结果时候,使用了自己定义的索引。如果不想使用索引,可以使用ignore index来忽略索引带来的影响。

explain
select *
from `course` ignore  index (idx_name)
where name like 'm%';

SQL语句如何强制使用索引?_SQL_05

综上,强制使用索引,在一定的范围是有效的,加上并不一定使用索引。如果不想使用索引,可以使用ignore index方式不使用索引。

程序员冈刀,目前就职于美团,java开发工程师,研究生。2022年,毕业于北京邮电大学电子工程学院、电子与通信工程专业。个人公众号《代码废柴》欢迎关注。

SQL语句如何强制使用索引?_sql_06

举报

相关推荐

0 条评论