MySQL:浅析 Impossible WHERE noticed after reading const tables
使用 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的更多相关文章
- MySQL特异功能之:Impossible WHERE noticed after reading const tables
用EXPLAIN看MySQL的执行计划时经常会看到Impossible WHERE noticed after reading const tables这句话,意思是说MySQL通过读取"c ...
- 线上MySQL慢查询现象案例--Impossible WHERE noticed after reading const tables
前言:2012年的笔记整理而得,发布个人博客,做备忘录使用. 背景:线上慢查询日志监控,得到如下的语句: 发现:select doc_text from t_wiki_doc_text w ...
- Impossible WHERE noticed after reading const tables
阿里云反馈的慢SQL,执行计划返回如下:Impossible WHERE noticed after reading const tables sql很简单: SELECT * FROM deposi ...
- mysql切换数据库提示警告:Reading table information for completion of table and column names
登录数据库后,选择数据库时发现以下提示, mysql> use testReading table information for completion of table and column ...
- Mysql浅析-基础命令(一)
主要从以上篇幅来介绍mysql的一些知识点 一.Mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数 ...
- 技术分享 | Prometheus+Grafana监控MySQL浅析
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 简介 Prometheus 一套开源的监控&报警&时间序列数据库的组合,通常 Kubernetes 中都会 ...
- 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 ...
- Mysql 备份数据库方法及when using LOCK TABLES错误解决方法
可以将以下代码保存为backup.bat,添加计划任务即可. @echo off ,,%" ,%" "D: -uname -pxxxx -P3306 --skip-loc ...
- Mysql查询优化器浅析
--Mysql查询优化器浅析 -----------------------------2014/06/11 1 定义 Mysql查询优化器的工作是为查询语句选择合适的执行路径.查询优化器的代码 ...
随机推荐
- 【NOIP2018】为什么这么无力啊
菜鸡又要爆零了 辛辛苦苦背板子结果考时候脑子一片空白 第一题线段树调了半小时 看完三道题两道写暴搜一道写暴力(说是暴搜,觉得更像写了个背包) 别提暴搜还忘记剪枝. . . . . . 我觉得考场上最菜 ...
- hdoj Radar Installation
Problem Description Assume the coasting is an infinite straight line. Land is in one side of coastin ...
- 【POJ 2449】 Remmarguts' Date
[题目链接] http://poj.org/problem?id=2449 [算法] A*(启发式搜索) 首先,求第k短路可以用优先队列BFS实现,当T第k次入队时,就求得了第k短路,但是,这种做法的 ...
- 杂项:ESB接口
ylbtech-杂项:ESB接口 ESB全称为Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢, ...
- Java多线程技术-Lock/Condition
在java1.5中Lock对象来实现同步的效果,而且使用上更方便. 使用ReentrantLock实现同步 public class MyService { private Lock lock = n ...
- ROS-TF-监听
前言:监听第一只海龟的位置,然后让第二只海龟跟随第一只海龟. 通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息. 一.新建cpp文件 新建turtle_tf_listene ...
- css选择器的综合使用
代码实现: <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf ...
- W3C标准冒泡、捕获机制
(一) 捕获和冒泡如何相互影响 我们来做几个任务吧! 有一个前提,#parent为标签,#child为子标签,他们是嵌套关系支线任务1 //捕获模式 document.getElementById(' ...
- Android中Button四种点击事件实现方式
1.Xml添加监听属性,这里添加的doClick. <Button android:id="@+id/bt1" android:layout_width="wrap ...
- java 练习
class Hello{ public static void main(String [] args) { System.out.println(" Hello 这是我的第一个java作品 ...