MySQL索引,查询中like 百分号 能用索引吗?

大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

上述问题的一般情况下,答案肯定是不能,但既然提问了,那肯定有能用的情况

为此,详细介绍下

首先我们先创建一个表

show create table test1\G
*************************** 1. row ***************************
Table: test1
Create Table: CREATE TABLE `test1` (
`id` varchar(10) DEFAULT NULL,
`n` varchar(10) DEFAULT NULL,
KEY `ix_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

运行如下查询 ,得到3行数据

select * from test1;
+------+------+
| id | n |
+------+------+
| 1000 | NULL |
| NULL | NULL |
| 1 | a |
+------+------+
3 rows in set (0.00 sec)

运行问题中的 like ‘%abc%’ 形式的SQL 语句 如下

其中id 列是有索引ix_id 的

desc select * from test1 where id like '%1000%'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1
filtered: 100.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)

从上的执行计划中可以看出 type: ALL 说明没用啥索引,走了全表扫描。复合一般情况下的预期答案。

下面我们进行能用到索引的情况

desc select id from test1 where id like '%1000%'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
partitions: NULL
type: index
possible_keys: NULL
key: ix_id
key_len: 33
ref: NULL
rows: 1
filtered: 100.00
Extra: Using where; Using index
1 row in set, 1 warning (0.00 sec)

如上述所示,type: index 说明使用了索引,虽然这个索引查找方法效率如何还是使用了。

这里有个以为,是为什么呢?

这个执行计划,我们不能单独看type: index 而且还需看一个 Using index 。

Using index 说明,没有进行回表操作,而只使用了索引。

那我们可以这样理解,一般情况下,索引被包含于整个表的,通俗点讲就是索引列的数量是少于整个表的数量,这次案例中是 索引是id 一个列 , 表是id ,n 两个列

那如果我们是MySQL 优化器, 你是选全表扫描 扫两个列呢 ,还是索引全扫描扫一个列呢,显然是扫索引全扫描的代价更小。这里值的代价主要是io

本次的答案已经给大家了,就是 like ‘%abc%’ 在特殊情况下是可以走索引的。

当然也留下了一些疑问,根据如上,我们在开发规范里添加什么等等,

谢谢大家~ 欢饮转发

我是知数堂SQL 优化班老师~ ^^

如有关于SQL优化方面疑问和一起交流的请加 并且 @兔子@知数堂SQL优化

高性能MySQL,SQL优化群 有叶金荣,吴炳锡 两位大神坐镇 : 579036588

欢迎加入 知数堂大家庭。

我的微信公众号:SQL开发与优化(sqlturning)

我会在头条提供相应例子的视频,希望大家关注

头条号

你可能感兴趣的:(SQL基础)