• 创建一表并指定了一个唯一索引
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 之前会优先根据这一条件查找出对应的记录,并用记录的实际值替换查询中所有使用到的该表属性。

  1. 当查询条件中包含了某个表的主键或者非空的唯一索引列
  2. 该列的判定条件为等值条件
  3. 目标值的类型与该列的类型一致
  4. 目标值为一个确定的常量

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相关推荐

  1. MySQL:浅析 Impossible WHERE noticed after reading const tables

    使用 EXPLAIN 执行计划的时候,在 Extra 中偶尔会看到这样的描述: Impossible WHERE noticed after reading const tables 字面上的意思是: ...

  2. MySQL:Impossible WHERE noticed after reading const tables

    Impossible WHERE noticed after reading const tables 阿里云反馈的慢SQL //sql如下 select * from table where req ...

  3. const mysql_mysql – 为什么我在解释查询中读取const表后会注意到“不可能”?

    我在表中有一个像fr(fromid,toid)这样的唯一复合键,当我使用explain运行查询时,我得到以下结果: Impossible WHERE noticed after reading con ...

  4. 浅谈 MySQL 子查询及其优化

    2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动 ...

  5. 8种常见SQL错误用法

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来源:https://dwz.cn/cgAPOWPx 1.LIMIT 语句 分页查询是最常用的 ...

  6. 8种常被忽视的SQL错误用法,快来认领一下!

    一.LIMIT  语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引 ...

  7. 新同事不讲武德,乱写 SQL 偷袭我!!

    来源:yq.aliyun.com/articles/72501 今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的 ...

  8. 你应该避免的8种常见SQL错误用法!

    来源:https://dwz.cn/cgAPOWPx 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方. 比如对于下面简单的语句,一般 DBA 想到的办法是在 type ...

  9. mysql 索引巧用,SQL语句写得忒野了

    今天来分享几个MySQL常见的SQL错误**(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的SQL语句效率低下,所以我们也可以自省自检一下. 1. LI ...

  10. sql exists用法_新同事不讲武德,这SQL语句写得忒野了

    来源 | developer.aliyun.com/article/72501今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题 ...

最新文章

  1. 一些思考,没想好标题
  2. 人工智能实践:TensorFlow笔记学习(五)—— 全连接网络基础
  3. IT人士,你的知识需要管理。
  4. Hadoop学习--HBase与MapReduce的使用
  5. golang之字符串
  6. python美化输出模块_Python 格式化输出 ( 颜色 )
  7. 学习笔记(58):Python实战编程-Combobox
  8. java serial_Java的@Serial批注
  9. Android疯狂ListView之旅 第一季 《侧滑删除条目》
  10. Emulator 29.2.12 稳定版发布,启用 Google Maps UI
  11. node.js的初步见解
  12. D. Berserk And Fireball(模拟)
  13. FLV在线flash播放器JW PLAYER
  14. HDU5855(最大权闭合图构图技巧+裸的最大流)
  15. 【51nod】---1278 相离的圆(二分排序)
  16. 编写计算机程序的几个步骤,第1讲程序设计的一般步骤ok.doc
  17. SQL语句中,有了别名不能再用原名,需要使用别名
  18. 关于卷积核大小的论文与思路
  19. 鸟什么羊什么的成语(鸟什么羊什么四字成语大全)
  20. MySQL--分组查询(group by)

热门文章

  1. Sass系统技术选型笔记(1)OS
  2. 洛谷P1957口算练习题
  3. Oracle怎么清除视图数据,Oracle删除视图
  4. 单片机及开发板的介绍
  5. EXCEL与数据分析
  6. hd4600黑苹果html5死机,HD4600终于可以不花屏了,写下心得。
  7. DZ60通过IIC读取LM75温度遇到问题解决方法
  8. NBT:根际微生物组抗番茄枯萎病(IF:35.724)
  9. 开心庄园html的代码,HTML第五章(示例代码)
  10. OpenWrt ADSL单线多拨,负载均衡(仅供参考)