Impossible WHERE noticed after reading const tables
- 创建一表并指定了一个唯一索引
CREATE TABLE `student_info` (`id` int(11) NOT NULL AUTO_INCREMENT,`student_id` int(11) NOT NULL,`name` varchar(20) DEFAULT NULL,`course_id` int(11) NOT NULL,`class_id` int(11) DEFAULT NULL,`create_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `idx_name` (`name`),KEY `idx_classid` (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=963277 DEFAULT CHARSET=utf8mb4
此时指定了2个索引,一个是name字段的唯一索引,一个是class_id字段的普通索引。
在使用explain查看以下sql的执行计划时,出现一下的补充提示
explain select * from student_info
where name = 'vznavzwoulu1c6jc' and class_id = 575
而且这条sql也没有用到任何索引。但是明明name和class_id字段都是有索引的。
查阅相关资料后得出结论,当sql的where条件满足以下4个条件时。MySQL在 EXPLAIN 之前会优先根据这一条件查找出对应的记录,并用记录的实际值替换查询中所有使用到的该表属性。
- 当查询条件中包含了某个表的主键或者非空的唯一索引列
- 该列的判定条件为等值条件
- 目标值的类型与该列的类型一致
- 目标值为一个确定的常量
name使用了唯一索引,满足第一条,且是等值条件,满足第二条,参数值是字符串类型,不存在隐式转换,满足第三条,且是一个确定的常亮,不存在使用函数或者子查询之类的,第四条满足,此时mysql就会查出一条唯一的值,然后拿这条记录的class_id与条件的class_id字段比较,发现不符合,于是提示了
Impossible WHERE noticed after reading const tables
- 尝试删除name的索引后再查询
drop index idx_name on student_info;
- 再继续查询
explain select * from student_info
where name = 'vznavzwoulu1c6jc' and class_id = 58184
此时优化器就用上了class这个索引。
- 测试添加联合索引
create index mul_class_id_name_create_time on student_info(class_id,name,create_time);
explain select sql_no_cache * from student_info
where name = 'zsd' and class_id = 781 and create_time > '2022-04-06'
虽然此时的查询条件顺序是name classid create_time,但优化器优化了顺序,使得能够使用上联合索引。
explain select sql_no_cache * from student_info
where name = '781' and create_time > '2022-04-06'
上述sql如果没有使用classid字段,则就会进行全表扫描,虽然name和createtime字段是有联合索引的。但是前提是当classid相同,才会给name排序,当name相同才会给createtime排序。也就是说不看classid,那么name和createtime根本就是乱序的,既然是乱序的只能进行全表扫描了。
Impossible WHERE noticed after reading const tables相关推荐
- MySQL:浅析 Impossible WHERE noticed after reading const tables
使用 EXPLAIN 执行计划的时候,在 Extra 中偶尔会看到这样的描述: Impossible WHERE noticed after reading const tables 字面上的意思是: ...
- MySQL:Impossible WHERE noticed after reading const tables
Impossible WHERE noticed after reading const tables 阿里云反馈的慢SQL //sql如下 select * from table where req ...
- const mysql_mysql – 为什么我在解释查询中读取const表后会注意到“不可能”?
我在表中有一个像fr(fromid,toid)这样的唯一复合键,当我使用explain运行查询时,我得到以下结果: Impossible WHERE noticed after reading con ...
- 浅谈 MySQL 子查询及其优化
2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...
- 8种常见SQL错误用法
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/cgAPOWPx 1.LIMIT 语句 分页查询是最常用的 ...
- 8种常被忽视的SQL错误用法,快来认领一下!
一.LIMIT 语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引 ...
- 新同事不讲武德,乱写 SQL 偷袭我!!
来源:yq.aliyun.com/articles/72501 今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的 ...
- 你应该避免的8种常见SQL错误用法!
来源:https://dwz.cn/cgAPOWPx 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方. 比如对于下面简单的语句,一般 DBA 想到的办法是在 type ...
- mysql 索引巧用,SQL语句写得忒野了
今天来分享几个MySQL常见的SQL错误**(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的SQL语句效率低下,所以我们也可以自省自检一下. 1. LI ...
- sql exists用法_新同事不讲武德,这SQL语句写得忒野了
来源 | developer.aliyun.com/article/72501今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题 ...
最新文章
- 一些思考,没想好标题
- 人工智能实践:TensorFlow笔记学习(五)—— 全连接网络基础
- IT人士,你的知识需要管理。
- Hadoop学习--HBase与MapReduce的使用
- golang之字符串
- python美化输出模块_Python 格式化输出 ( 颜色 )
- 学习笔记(58):Python实战编程-Combobox
- java serial_Java的@Serial批注
- Android疯狂ListView之旅 第一季 《侧滑删除条目》
- Emulator 29.2.12 稳定版发布,启用 Google Maps UI
- node.js的初步见解
- D. Berserk And Fireball(模拟)
- FLV在线flash播放器JW PLAYER
- HDU5855(最大权闭合图构图技巧+裸的最大流)
- 【51nod】---1278 相离的圆(二分排序)
- 编写计算机程序的几个步骤,第1讲程序设计的一般步骤ok.doc
- SQL语句中,有了别名不能再用原名,需要使用别名
- 关于卷积核大小的论文与思路
- 鸟什么羊什么的成语(鸟什么羊什么四字成语大全)
- MySQL--分组查询(group by)