关于MySQL数据库中使用like对索引的影响
之前只知道在数据库中like对索引的影响是%的位置不同,%在配置值的后面才能执行索引,今天有时间就单独写个表看看到底什么区别;
##创建表 设置主键自增
CREATE TABLE test(id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(255),PRIMARY KEY(id) );
## 添加索引
ALTER TABLE test ADD INDEX name_index (name);
## 查看索引
SHOW INDEX FROM test;
## 添加记录
INSERT INTO test VALUES((1,'qq'),(2,'qqf'),(3,'abc'),(4,'aabc');
生成表后进行查看like对索引的影响:
## 第一种不加%
explain select * from test where name like 'q';
## 第二种%在后
explain select * from test where name like 'q%';
## 第三种%在前
explain select * from test where name like '%q';
## 第四中前后都有%
explain select * from test where name like '%q%';
比较一下这四种情况,发现都使用了索引,possible_keys表示的是可以使用的索引,key表示查询过程中实际使用的索引
type中有index,和range两种
index: index类型遍历全表索引树
range:只检索给定范围的行,使用一个索引来选择行
现在表中只有两个字段,主键id是和name都是有索引的字段,下面在加一个不是索引的字段,
ALTER TABLE `test`
ADD COLUMN `status` int(11) UNSIGNED NULL DEFAULT 1
现在我们在重新走一遍这四个查询:
## 第一种不加%
explain select * from test where name like 'q';
## 第二种%在后
explain select * from test where name like 'q%';
## 第三种%在前
explain select * from test where name like '%q';
## 第四中前后都有%
explain select * from test where name like '%q%';
结果就是%在匹配值后面才能用到索引,和前面的比较就是之前的字段是id,name 而id是主键,是索引的一部分 所以select * 取的两个字段都是索引字段。所以 like 语句都会使用到索引。
后面加了一个非索引字段status,并且取数据列表里也存在status字段,所以%在匹配值前的情况就会受影响。
当然如果不是select * ,而是select id 或者select name 再或者 select id,name 都会使用上索引。
大家有条件的也可以试试,看看这个结果,至少可以加深记忆。
推荐阅读
-
面试|简单描述MySQL中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)
-
关于mysql数据库中distinct,concat,ifnull的使用讲解
-
MySQL中NULL对索引的影响深入讲解
-
MySQL中关于ORDERBY、DISTINCT、ALTER、LIKE/NOTLIKE、REGEXP/NOTREGEXP、COUNT、MAX的使用介绍
-
MySQL中字符串索引对update的影响分析_MySQL
-
面试|简单描述MySQL中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)
-
mysql索引,mysql中的like模糊查询是否使用索引?
-
关于MySQL数据库中使用like对索引的影响
-
MySQL中join语句的基本使用教程及其字段对性能的影响_MySQL
-
探究MySQL中索引和提交频率对InnoDB表写入速度的影响_MySQL