mysql在哪些情况下不走索引

发布时间:2021-12-18 22:01:58 阅读:2399次

我们知道为了提高mysql的查询效率,我们需要加索引

那么在哪些情况下mysql是不走索引的呢?

1.索引列参与计算,不走索引!

SELECT username FROM t_user WHERE age=20;-- 会使用索引
SELECT username FROM t_user WHERE age+10=30;-- 不会使用索引!!因为所有索引列参与了计算
SELECT username FROM t_user WHERE age=30-10;-- 会使用索引

2.索引列使用了函数,不走索引!

-- 不会使用索引,因为使用了函数运算,原理与上面相同
SELECT username FROM t_user WHERE concat(username,'1') ='admin1';
-- 会使用索引
SELECT username FROM t_user WHERE username =concat('admin','1');

3.索引列使用了Like %XXX,不走索引!

like 模糊查询 前模糊或者 全模糊不走索引
select * from user where username like '%mysql测试'

4.隐式转换——字符串列与数字直接比较,不走索引!

SELECT * FROM t_user WHERE age='23' -- 走索引

5.尽量避免 OR 操作,只要有一个字段没有索引,改语句就不走索引,不走索引!

select * from t_user where username = 'mysql测试' or password ='123456'

6.where id !=2 或者 where id <> 2,不走索引!

select * from t_user where username <> 'mysql测试'

7. is null,is not null也无法使用索引,不走索引!

select * from t_user where username is not null --is not null 不走索引

8.复合索引a-b-c,a用到,b用不到,c用不到,ab有效,ba有效,a or b无效,ac有效,bc无效,abc有效 ,不走索引!

CREATE TABLE t_user (
id bigint(20) NOT NULL AUTO_INCREMENT,
username varchar(255) DEFAULT NULL,
password varchar(255) DEFAULT NULL,
gender int(255) DEFAULT NULL,
age int(11) DEFAULT NULL,
address varchar(255) DEFAULT NULL,
PRIMARY KEY (id),
KEY age (age),
KEY username (username(191))
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb4;

查看索引
show keys from users

explain select * from t_user where username = 'admin'

type列,连接类型。一个好的SQL语句至少要达到range级别。杜绝出现all级别。range的包含范围有一定的阈值,超过会进行全文扫描
key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。
key_len列,索引长度。
rows列,扫描行数。该值是个预估值。
extra列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。

如有问题,可以QQ搜索群1028468525加入群聊,欢迎一起研究技术

支付宝 微信

有疑问联系站长,请联系QQ:QQ咨询

转载请注明:mysql在哪些情况下不走索引 出自老鄢博客 | 欢迎分享