表代码:
CREATE TABLE `t_user1` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
`useremail` char(20) NOT NULL,
`PASSWORD` char(20) NOT NULL,
`number` int(3) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `t_user_name` (`name`),
KEY `t_user_email` (`useremail`),
KEY `index_number` (`number`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
往里面添加数据
需要的sql
SELECT * from t_user1;
explain SELECT * from t_user1 where useremail = '123@qq.com';
alter table t_user1 add number int(3) unsigned not Null ;
desc t_user1;
update t_user1 set number = 16 where id=3;
create INDEX index_number on t_user1(number);
explain SELECT * from t_user1 where number = 2; -- 使用了索引
explain SELECT * from t_user1 where number > 2;-- 使用了索引
explain SELECT * from t_user1 where useremail like '123@qq.com';-- 使用了索引
-- explain SELECT * from t_user1 where useremail like '123%';-- 有没有使用了索引(有待论证)
explain SELECT * from t_user1 where useremail like '%123%';-- 没使用了索引
图片
explain中每一个列都是有特定意义的,我们今天就来聊一聊key_len
这个字段和负载有关系。
单列索引我们不用去计算,因为没有意义,如果是组合索引,那么知道这里的长度就是非常有意义的,我们先简单来看看这个单列索引的key_len是如何计算的。
查询的资料
时间:2020.7.31
事件,这篇博文有网友提出有点问题,我就把这篇博文私密访问了,打算处理完在公开,只是没想到拖了这么久。开始分析问题:
-- explain SELECT * from t_user1 where useremail like '123%';-- 没使用了索引(有待论证)
提出 like '123%'的情况下是走索引的,但是我在环境里运行的结果是没有走索引,如图
explain SELECT * from t_user1 where useremail like '123%';
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/678ba6aa1f9d5c0863bdcf6f763e4d26.png)
key里面没有东西,只有possible_key里面有,那么问题出现在哪里?
想想。
大家看type —— all,发现问题了吧,
这个出现误区的问题有两个,1.useremail的数据太相近,2.like的筛选太相近
我的插入数据:
INSERT into t_user1 (`name`,useremail,`PASSWORD`,number ) values
('张三','123@qq.com','123@qq.com',3),
('李四','1234@qq.com','1234@qq.com',4),
('王五','12345@qq.com','12345@qq.com',5),
('陈六','123456@qq.com','123456@qq.com',6)
我们在记录不变的情况下改变like的筛选
explain SELECT * from t_user1 where useremail like '123@%';
key里是有值的。
发现问题背后的问题:某些情况下,输出全部的数据,它就没走索引。
感谢网友@慕枫520 和 @qq_40104261 谢谢你们的指出,不然的话我可能会误导更多的伙伴