当前位置:   article > 正文

MySQL补充(一)——MySQL查询不走索引的情况_bigint 不走索引的情况

bigint 不走索引的情况
一个简单的表
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
# 查看索引
show keys from users
  • 1
  • 2

在这里插入图片描述

explain select * from t_user  where username = 'admin'
  • 1

在这里插入图片描述

  • type列,连接类型。一个好的SQL语句至少要达到range级别。杜绝出现all级别。range的包含范围有一定的阈值,超过会进行全文扫描
  • key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。
  • key_len列,索引长度。
  • rows列,扫描行数。该值是个预估值。
  • extra列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。
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;-- 会使用索引
  • 1
  • 2
  • 3
2.索引列使用了函数,不走索引!
-- 不会使用索引,因为使用了函数运算,原理与上面相同
SELECT username FROM t_user WHERE concat(username,'1') ='admin1'; 
-- 会使用索引
SELECT username FROM t_user WHERE username =concat('admin','1'); 
  • 1
  • 2
  • 3
  • 4
3.索引列使用了Like %XXX,不走索引!

like 模糊查询 前模糊或者 全模糊不走索引

select * from user where username like '%mysql测试' 
  • 1
4.隐式转换——字符串列与数字直接比较,不走索引!
SELECT * FROM t_user WHERE `age`='23' -- 走索引
  • 1
5.尽量避免 OR 操作,只要有一个字段没有索引,改语句就不走索引,不走索引!
select * from t_user  where username  = 'mysql测试' or password ='123456'
  • 1
6.where id !=2 或者 where id <> 2,不走索引!
select * from t_user where username <> 'mysql测试'
  • 1
7. is null,is not null也无法使用索引,不走索引!
select * from t_user where username  is not null --is not null 不走索引
  • 1
8.复合索引a-b-c,a用到,b用不到,c用不到,ab有效,ba有效,a or b无效,ac有效,bc无效,abc有效 ,不走索引!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/381364
推荐阅读
相关标签
  

闽ICP备14008679号