使用 EXPLAIN 执行计划的时候,在 Extra 中偶尔会看到这样的描述:

Impossible WHERE noticed after reading const tables

字面上的意思是:读取const tables表之后, 没有发现匹配的行。

通过示例我们重现一下该场景。首先创建两张表,班级表(class),学生表(student)。

CREATE TABLE `class` (

`id` int(11) NOT NULL,

`name` varchar(100) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `class` VALUES ('1', '计算机1班');

INSERT INTO `class` VALUES ('2', '计算机2班');

INSERT INTO `class` VALUES ('3', '计算机3班');
CREATE TABLE `student` (

`id` int(11) NOT NULL,

`name` varchar(100) DEFAULT NULL,

`class_id` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `student` VALUES ('1', '张三', '1');

INSERT INTO `student` VALUES ('2', '李四', '2');

INSERT INTO `student` VALUES ('3', '王五', '3');

然后执行如下查询语句:

EXPLAIN

select a.*, b.*

from class a, student b

where b.id=99 and a.id = b.class_id

在 MySQL 5.6.22 下的执行结果如下图所示,符合我们的预期。

而在 MySQL 5.7.17 下的执行结果如下图所示,可以发现同样的表结构、同样的数据、同样的查询语句,发现 Extra 中的显示的内容为“no matching row in const table”,这句话理解起来就容易多了。我估计之前的语句表达的语义不太明确,才在新的版本中进行的修改吧(个人猜测,勿喷哈)。

产生“ Impossible WHERE noticed after reading const tables”的原因是这样的,当在查询语句中存在满足如下条件的 WHERE 语句时,MySQL在 EXPLAIN 之前会优先根据这一条件查找出对应的记录,并用记录的实际值替换查询中所有使用到的该表属性。这是因为满足以下四个条件时,就会使得针对该表的查询最多只能产生一条命中结果。在该表无法命中数据的情况下就会提示“在 const table 表中没有找到匹配的行”,而这个 “const table”就指的是满足下面四个条件的表。这是 MySQL 的一个优化策略。

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

select a.*, b.*

from class a, student b

where b.id=99 and a.id = b.class_id

“`

上面的语句中,student (b)表刚好满足以上的4个条件,分析如下:

  • b.id 为表的主键
  • b.id=99 为等值条件
  • 99 为 int 类型,id 也为 int 类型
  • 99 是一个确定的常量

根据b.id=99的查询条件,无法命中数据。因此出现了我们期望的 Extra 描述。

MySQL:浅析 Impossible WHERE noticed after reading const tables的更多相关文章

  1. MySQL特异功能之:Impossible WHERE noticed after reading const tables

    用EXPLAIN看MySQL的执行计划时经常会看到Impossible WHERE noticed after reading const tables这句话,意思是说MySQL通过读取"c ...

  2. 线上MySQL慢查询现象案例--Impossible WHERE noticed after reading const tables

    前言:2012年的笔记整理而得,发布个人博客,做备忘录使用. 背景:线上慢查询日志监控,得到如下的语句:       发现:select doc_text from t_wiki_doc_text w ...

  3. Impossible WHERE noticed after reading const tables

    阿里云反馈的慢SQL,执行计划返回如下:Impossible WHERE noticed after reading const tables sql很简单: SELECT * FROM deposi ...

  4. mysql切换数据库提示警告:Reading table information for completion of table and column names

    登录数据库后,选择数据库时发现以下提示, mysql> use testReading table information for completion of table and column ...

  5. Mysql浅析-基础命令(一)

    主要从以上篇幅来介绍mysql的一些知识点 一.Mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数 ...

  6. 技术分享 | Prometheus+Grafana监控MySQL浅析

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简介 Prometheus 一套开源的监控&报警&时间序列数据库的组合,通常 Kubernetes 中都会 ...

  7. MYSQL Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as

    [2019-04-21 10:17:20] [ERROR] [org.hibernate.engine.jdbc.spi.SqlExceptionHelper:144] Statement viola ...

  8. Mysql 备份数据库方法及when using LOCK TABLES错误解决方法

    可以将以下代码保存为backup.bat,添加计划任务即可. @echo off ,,%" ,%" "D: -uname -pxxxx -P3306 --skip-loc ...

  9. Mysql查询优化器浅析

    --Mysql查询优化器浅析 -----------------------------2014/06/11 1 定义    Mysql查询优化器的工作是为查询语句选择合适的执行路径.查询优化器的代码 ...

随机推荐

  1. Android面试常问的技术问题

    面试时技术经理会问你一些工作中遇到的Android方面的问题.谈谈你所做的项目,和在项目中所扮演的角色. 很多其它内容请參考我的博客:点击打开链接 1.怎样优化ListView? ①Item布局,层级 ...

  2. Why is try {…} finally {…} good; try {…} catch{} bad?

    http://stackoverflow.com/questions/128818/why-is-try-finally-good-try-catch-bad The big difference i ...

  3. hihocoder 1676 树上等差数列 黑科技树形dp

    #1676 : 树上的等差数列 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵包含N个节点的无根树,节点编号1~N.其中每个节点都具有一个权值,第i个节点的权值 ...

  4. BKDRHash 算法 php 版本( 可用于 字符串 hash 为int 转)

    <?php function BKDRHash($str) { $seed = 131; // 31 131 1313 13131 131313 etc.. $hash = 0; $cnt = ...

  5. 洛谷P1725琪露诺(单调队列优化dp)

    P1725 琪露诺 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精.某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪 ...

  6. SpringAOP使用注解实现5种通知类型

    spring aop的5种通知类型都有 Before前置通知 AfterReturning后置通知 Around环绕通知 AfterThrowing异常通知 After最终通知 首先创建接口和实现类 ...

  7. gitlab克隆报错:remote: HTTP Basic: Access denied;remote: You must use a personal access token with ‘api’ scope for Git over HTTP.

    错误: remote: HTTP Basic: Access denied remote: You must use a personal access token with ‘api’ scope ...

  8. git的常用命令。。

    git的常用命令.. git help <command>  显示command的help git show  显示某次提交的内容 git show $id git co -- <f ...

  9. OPPO R9sPlus MIFlash线刷TWRP Recovery ROOT详细教程

    教程转载来自 残芯此生不换  OPPO R9sPlus 目前最简单的刷Recovery root 方法,强烈推荐 新机想要刷第三方卡刷包的最简单过程是:           手机关机-->下载M ...

  10. 【PostgreSQL-9.6.3】如何得到psql中命令的实际执行SQL

    当我们在psql界面执行以“\”开头的命令时,数据库会立刻返回执行结果,而不会返回命令的实际执行过程.通过两种方式可以实现执行过程的查看: 方法一:启动psql命令时加“-E”参数 postgres@ ...