用EXPLAIN看MySQL的执行计划时经常会看到Impossible WHERE noticed after reading const tables这句话,意思是说MySQL通过读取“const tables”,发现这个查询是不可能有结果输出的。比如对下面的表和数据:

  create table t (a int primary key, b int) engine = innodb;  insert into t values(1, 1);    insert into t values(3, 1);

执行“EXPLAIN select * from t where a = 2”时就会输出“Impossible WHERE noticed after reading const tables”。

##5.6时会输出上面的报错,如果是5.7 extra列输出为“no matching row in const table”

不明白所谓的“const tables”是什么意思,对MySQL在查询优化时竟然可以发现一个查询不可能输出结果更是感觉不可思议。按数据库中“传统”的做法,查询优化时只会访问模式定义和统计信息,而据我所知,数据库中使用的各种统计信息如EquiDepth、MaxDiff柱状图,MCV,属性的最大值、最小值等都不可能精确到能够断言在上述的表中不存在“a = 2”的记录。

今天看MySQL Internal手册时才总算弄明白,原来MySQL并没有什么神奇之处,这个Impossible WHERE noticed after reading const tables的结论并不是通过统计信息做出的,而是真的去实际访问了一遍数据后,发现确实没有“a = 2”的行才得出的。

当查询中对某个表指定了主键或非空唯一索引上的等值条件,从而使得最多只可能产生一条命中结果(只对该表而言)时,MySQL在EXPLAIN之前会优先根据这一条件查找出对应的记录,并用记录的实际值替换查询中所有用到来自该表的属性的地方。一个更复杂的例子如下:

  explain select * from t as t1, t as t2 where t1.a = 1 and t2.a = t1.b + 1;

的输出结果为(由于排版关系省略了一些输出内容):+----+...+-----------------------------------------------------+| id | ... | Extra                                               |+----+...+-----------------------------------------------------+|  1 | ... | Impossible WHERE noticed after reading const tables |+----+...+-----------------------------------------------------+

MySQL得出上述查询不会输出结果的步骤如下:
1、首先根据t1.a = 1条件找到一条记录(1,1);
2、将上述记录中b的值1替换查询中的t1.b,即将上述查询转化为等价的“explain select 1, 1,t2.a, t2.b from t as t2 where t2.a = 1 + 1”;
3、优化器计算常量表达式的值,即计算1+1得出结果为2;
4、优化器根据t2.a = 2条件查找,发现没有命中记录;
5、优化器最终打断出上述查询不可能输出结果。

说白了,这个“Impossible WHERE noticed after reading const tables”就不再神秘了。但从这件事,我更加感觉到MySQL是个“怪怪”的数据库,有很多地方跟惯常的做法不太一样。很多数据库会在联接时将指定了唯一索引等值条件的表优先执行,作为查询执行的第一步,但据我所知只有MySQL将这一步骤提前到查询优化的第一步来做。这么做到底在什么情况下才有好处好像是个很微妙的问题,对于本文中给出的这两个例子,在优化时还是执行时做这一步开销都没什么区别。不过这么做好像没什么坏处。

这么会导致一个“怪怪”的现象,那就是EXPLAIN有时候也会被阻塞。比如“EXPLAIN select * from t where a = 2 lock in share mode”,同时又有另一个事务插入了一条a = 2的记录而没有提交时,EXPLAIN就会在那里等锁。

MySQL特异功能之: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. 【MySQL】MySQL USE 库的时候报错 Reading table information for completion of table and column names

    1.背景 mysql -A不预读数据库信息(use dbname 更快) -Reading table information for completion of table and column n ...

  4. Mysql报错:Got an error reading communication packets

    一.故障说明 某次一线巡检过程中发现,上午8点.9点左右kafka消息积压数异常增加,且同时Mysql数据库主从同步异常,测试数据库远程登录报错:Host -- is blocked because ...

  5. MySQL(九):InnoDB 表空间(Tables)

    本节着重分析一下表空间,通过本节我们将清楚以下几个问题: 1.什么是表空间(Tablespace)? 2.InnoDB 存储引擎有哪些表空间(Tablespace)? 3.InnoDB 存储引擎中的表 ...

  6. mysql数据库元表_mysql中元数据库information_schema学习之TABLES表

    在information_schema数据库中的表都只是只读的,不能进行更新.删除和插入操作,也不能加触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件. 在information_sche ...

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

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

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

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

  9. MYSQL的深入学习--优化步骤

    MySql优化的一般步骤 1.通过show status 命令了解各种sql的执行效率 SHOW STATUS提供msyql服务器的状态信息 一般情况下,我们只需要了解以"Com" ...

  10. mysql优化问题?_MYSQL优化问题

    执行计划与执行明细 1,Explain:可以让我们查看MYSQL执行一条SQL所选择的执行计划: 1,ID:执行查询的序列号: 2,select_type:使用的查询类型 1,DEPENDENT SU ...

最新文章

  1. 三星笔记本FN功能键操作大全
  2. 自学入门不在困难,初学者挑战学习Python编程30天 (三)
  3. PowerDesigner的下载及安装
  4. 20170227玩呗娱乐
  5. 我的天,代码居然也需要保养?
  6. 阿里P8架构师谈:架构设计经验汇总
  7. mysql触发器求属性和_MySQL触发器demo
  8. oracle 内部表连接方式,ORACLE 表连接方式
  9. Python Map, Filter and Reduce
  10. angular4动态添加html,angular4 动态创建组件
  11. 【连载】人类唯一的出路:变成人工智能(二)脑机接口
  12. 停止、删除所有的docker容器和镜像
  13. 洛谷——P2043 质因子分解
  14. C语言——指针篇(三)数组的下标引用和指针访问
  15. HttpClient之Java爬虫工具
  16. 非常值得收藏的15个 Google 高级搜索技巧
  17. 【业余无线电BI1FKP】宝峰UV9R-Plus写频、自制写频线
  18. 椭圆曲线数字签名算法
  19. 修改xshell的配色方案
  20. 遇到unhandled exception:怎么处理?

热门文章

  1. 机器学习 | 实战(一)Decision_tree_红酒数据集
  2. “你爱我,我爱你,蜜雪冰城甜蜜蜜“秋天的第一杯奶茶!Python安排!!
  3. php对接微博热搜,基于PHP爬虫的微博热搜实时监控平台
  4. PDF转成图片后不清晰怎么办呢?
  5. 如何用Python爬取你的微信好友信息
  6. Windows上的安全模式
  7. 分享 | 将Pytorch模型部署到Movidius神经计算棒
  8. lm75b 读取温度 c语言,STC单片机读取LM75A温度的代码,以及ADC读取电压。给大家分享一下把...
  9. 谈谈我对面向对象的理解
  10. Linux 上格式化ssd硬盘方法