我们知道为了提高mysql的查询效率,我们需要加索引
那么在哪些情况下mysql是不走索引的呢?
1.索引列参与计算,不走索引!
SELECTusername
FROMt_user
WHERE age=20;-- 会使用索引
SELECTusername
FROMt_user
WHERE age+10=30;-- 不会使用索引!!因为所有索引列参与了计算
SELECTusername
FROMt_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加入群聊,欢迎一起研究技术
转载请注明:mysql在哪些情况下不走索引 出自老鄢博客 | 欢迎分享