MySQL:explain结果中Extra:Impossible WHERE noticed after reading const tables

2023-11-07

MySQL:explain结果中Extra:Impossible WHERE noticed after reading const tables

前情提要

今天上午有同事突然找我,向我反馈说在对MySQL中的语句进行explain解析的时候,explain的结果中table、type、possible_keys、key等关键性字段都是空的,什么信息都得不到,而当把其中一个字段phone,类型是varchar的单引号去掉了之后,也就是说把where phone='13800138000' 改为where phone=13800138000之后,再执行explain就能得到explain的关键性字段的结果了,这个就让我很纳闷,不合常理啊,字段的隐式转换正常来说这种情况应该会导致索引失效才对啊,现在竟然是反之生效,刷新了我们的认知。我就说了下面一句话:

一个不合常理的现象往往都是由于一个不起眼的或者平时被我们忽略的点所造成的

出现的情况

这种非常理所能解释通的现象,引起了我的好奇心。
在这里插入图片描述

从上图中看到Extra:Impossible WHERE noticed after reading const tables,字面上的意思是:读取const tables表之后,没有发现匹配的行。其实,这个跟MySQL的版本有关,在 MySQL 5.7.17 下的执行结果中可以发现同样的表结构、同样的数据、同样的查询语句,Extra 中的显示的内容为“no matching row in const table”,这句话理解起来就容易多了。

原因

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

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

而我们的这张表user_info的这个查询语句刚好符合这4个条件,原因:
1、phone是非空的唯一索引列;
2、phone= '13800138000’是等值条件
3、phone是字符串类型,'13800138000’也是字符串类型
4、13800138000是一个确定的常量

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL:explain结果中Extra:Impossible WHERE noticed after reading const tables 的相关文章

  • 主键默认可以为NULL吗?为什么这样描述呢?

    我有一张桌子 当我describe这是 mysql gt DESC my table Field Type Null Key Default Extra contact id int 11 NO PRI NULL auto incremen
  • 数据库中的 HTML 标签是不好的做法还是好的做法?

    有时我需要格式化来自数据库的特定数据或部分数据 例如 如果我有这样的 desc 存储在数据库中 HTML 4 经过调整 延伸和增强 超出了其最初的范围 为网站带来了高水平的交互性和多媒体 Flash Silverlight 和 Java 等
  • 使用 php 和 mysql 计算日期差(以小时为单位)

    我如何使用 php 和 mysql 找到以小时为单位的日期差异 Use TIMEDIFF http dev mysql com doc refman 5 1 en date and time functions html function
  • MySQL通过UPDATE/DELETE合并重复数据记录

    我有一个看起来像这样的表 mysql gt SELECT FROM Colors ID USERNAME RED GREEN YELLOW BLUE ORANGE PURPLE 1 joe 1 null 1 null null null 2
  • PDO获取最后插入的ID

    我有一个查询 我想获取插入的最后一个 ID 字段ID是主键并且自动递增 我知道我必须使用这个声明 LAST INSERT ID 该语句适用于如下查询 query INSERT INTO cell place ID VALUES LAST I
  • 如何在 Ansible 中运行 MySQL 查询

    我需要编写一个 Ansible 脚本来在 MySQL 数据库中执行 SQL 查询 这是我尝试过的 你能指导一下吗 hosts localhost tasks name retrive data command mysql u root h
  • 在内连接中重用 mysql 子查询

    我正在尝试优化查询 试图避免重复用 指示的查询 复杂查询 使用两次 结果相同 原始查询 SELECT news FROM news INNER JOIN SELECT myposter FROM SELECT COMPLEX QUERY U
  • 如何在php/mysql中使用事务

    我正在使用 php mysql 我知道 mysql 中的事务 但不能在我的脚本中使用 下面是我的脚本 如何在我的代码中使用 php 事务 即 BEGIN ROLLBACK COMMIT foreach json a shop as json
  • JPA中如何连接多个数据库?

    我有一个 Spring Boot 应用程序 当前使用 JPA 连接到单个数据库 application properties 文件中的连接详细信息 spring datasource url jdbc oracle thin localho
  • MySQL 薛定谔表:存在,但不存在

    我遇到了最奇怪的错误 有时 在创建或更改表时 我会收到 表已存在 错误 但是 DROP TABLE 返回 1051 未知表 所以我得到了一个无法创建 无法删除的表 当我尝试删除数据库时 mysql 崩溃了 有时它有助于创建另一个具有不同名称
  • PHP-MySQLi 连接随机失败并显示“无法分配请求的地址”

    大约两周以来 我一直在处理 LAMP 堆栈中最奇怪的问题之一 长话短说 与 MySQL 服务器的随机连接失败并显示错误消息 Warning mysqli real connect HY000 2002 Cannot assign reque
  • mysql时间比较

    我有 job start 和 job end 时间 timediff 会给我时间差 现在我想看看这项工作是否花费了超过 2 小时 30 分钟 我如何比较它 如果我这样做 我会收到错误 timediff job start job end g
  • “create_date”时间戳字段的默认值无效

    我有以下 sql 创建语句 mysql gt CREATE TABLE IF NOT EXISTS erp je menus gt id INT 11 NOT NULL AUTO INCREMENT gt name VARCHAR 100
  • 在python中将数据库表写入文件的最快方法

    我正在尝试从数据库中提取大量数据并将其写入 csv 文件 我正在尝试找出最快的方法来做到这一点 我发现在 fetchall 的结果上运行 writerows 比下面的代码慢 40 with open filename a as f writ
  • 具有“日期之间”的 CakePHP 模型

    我有一个很大的数据集 超过十亿行 数据在数据库中按日期分区 因此 我的查询工具必须在每个查询上指定一个 SQL Between 子句 否则它将必须扫描每个分区 而且 它会在返回之前超时 所以 我的问题是 分区的数据库中的字段是日期 使用 C
  • Monkeyrunner/jython 中未找到 JDBC 驱动程序错误

    我需要在中插入一些东西DB 我在用着JDBC as a connector jython the script mysql数据库和脚本正在运行CentOS 我的代码看起来像这样 from com android monkeyrunner i
  • 批处理文件并与数据库比较

    目前我正在开发一个 Spring Boot 应用程序 该应用程序定期尝试处理包含用户数据的文件 其中每行都包含userId and departamentId隔开 例如123534 13 该文件将包含数百万条记录 我的要求是以这样的方式将此
  • Rails has_many 到 has_many 具有多个模型

    模拟以下情况的最佳方法是什么 Word belongs to wordable polymorphic gt true Phrase has many words as gt workable belongs to story Line h
  • 控制数据是否存在于数组中

    我在mysql中有两个不同的表 我正在使用curl从json文件中获取数据 我的第一个表名称是 tblclients 该表存储客户端数据 我的第二个表名称是 tblcustomfieldsvalues 该表使用 tblclients 表的
  • 错误 1305 (42000):保存点...不存在

    我的 MYSQL 数据库中有这个 SQL 存储过程为空 所以我猜没有隐式提交 DROP PROCEDURE IF EXISTS doOrder DELIMITER CREATE PROCEDURE doOrder IN orderUUID

随机推荐

  • 最近跳槽了,历经华为测试岗4轮面试,3个小时灵魂拷问,透心凉结局.....

    大多数情况下 测试员的个人技能成长速度 远远大于公司规模或业务的成长速度 所以 跳槽成为了这个行业里最常见的一个词汇 前几天 我看到有朋友留言说 他在面试华为的自动化测试工程师的时候 灵魂拷问三小时 不幸挂掉了 越想越可惜 回想面试经过 好
  • 比double精度更高的数据类型_Oracle数据类型总结

    ORACLE基本数据类型 亦叫内置数据类型 built in datatypes 可以按类型分为 字符串类型 数字类型 日期类型 LOB类型 LONG RAW RAW类型 ROWID UROWID类型 1 1字符类型 字符串数据类型还可以依
  • matlab function的使用

    首先创建一个m文件 Matlab函数定义格式 用关键字function定义函数 function 输出变量 函数名称 输入变量 注释 函数体 简单的函数如下 function a b c test d e f a d e b e f c f
  • 下载工具IDM之——无法下载此受保护的数据其他解决方案

    一 现象描述 在使用IDM进行直播流数据下载时 可能会显示如下信息 二 解决办法 2 1 使用ffmpeg 下载配置ffmpeg后 使用下面的指令合成视频 ffmpeg i http ivi bupt edu cn hls cctv1hd
  • ABAP DOI展示EXCEL或WORD

    正文部分 DOI技术算是比较老的技术了 用来直接调用office展示结果 可以是EXCEL也可以是WORD data begin of s fal include structure faglflext data end of s fal
  • 统计假设检验

    1 假设检验基本思想 假设检验是由K Pearson于20世纪提出的 之后由费希尔 Fisher 进行了细化 并最终由奈曼和E Pearson提出了较完整的假设检验理论 假设检验的基本思想是 小概率事件 原理 其统计推断方法是带有某种概率性
  • 解决SpringMVC重定向参数无法携带问题

    解决SpringMVC重定向参数无法携带问题 场景 重定向时请求参数会丢失 我们往往需要重新携带请求参数 我们可以进 动参数拼接如下 return redirect handle01 name name 但是上述拼接参数的 法属于get请求
  • 关于使用流进行排序

    关乎流中的排序 使用collections的sort函数进行排序 不改变属性值 只会改变位置 public void setResultListByTime List
  • java匹配注释的正则表达式

    参考http iregex org blog uncomment program with regex html 通用注释有两种 1 2 通常情况下 行级注释可以这样匹配 n 块级别这样 或者还可以这样 s 不过在特殊情况中 行级别会跟协议
  • [附源码]计算机毕业设计学生宿舍维修管理系统Springboot程序

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • ‘“node --max-old-space-size=4096“‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    问题描述 使用npm run dev的时候报如下错误 node max old space size 4096 不是内部或外部命令 也不是可运行的程序或批处理文件 FATAL ERROR Ineffective mark compacts
  • CMD打开闪退问题修复

    CMD termain 打开闪退问题修复 Date 2022 06 01 01 问题说明 今天 VSC Remote SSH 突然无法工作 不确定是否因为我卸载 MiniConda 导致 然后开始折腾 VSC 问题如下 Could not
  • 将微信小程序页面转为图片

    最近做项目遇到一个需求 那就是要将某个页面转为图片然后传给后端 我仔细找了一圈 发现官方那个Api也就是wx canvasToTempFilePath生成的图片很有可能为空 太坑了 于是我放弃用它了 选择了用wxml2canvas 安装wx
  • MySQL索引(index)专题

    1 MySQL索引简介 索引 Index 是帮助MySQL高效获取数据的数据结构 它的存在形式是文件 索引能够帮助我们快速定位数据 它可以让mysql高效运行 大大提高mysql的查询 包括排序 分组 效率 Mysql目前主要有以下几种索引
  • 程序员面试题精选100题(04)-二元树中和为某一值的所有路径

    程序员面试题精选100题 04 二元树中和为某一值的所有路径 题目 输入一个整数和一棵二元树 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径 打印出和与输入整数相等的所有路径 例如输入整数22和如下二元树 10 5 12
  • 集合的父子类关系

    一 Collection的父子类关系 1 Iterable java集合的顶级接口之一 实现此接口的类可以使用新的for循环2 Iterator 接口 遍历器 ListIterator 方法 hasNext next remove 3 Co
  • openstack对接gluster流程

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在已经部署好的gluster集群里创建相应的卷 可参考https my oschina net u 857184 blog 1506552 mkdir p data bri
  • 还分不清 Cookie、Session、Token、JWT?

    什么是认证 Authentication 通俗地讲就是验证当前用户的身份 证明 你是你自己 比如 你每天上下班打卡 都需要通过指纹打卡 当你的指纹和系统里录入的指纹相匹配时 就打卡成功 互联网中的认证 用户名密码登录 邮箱发送登录链接 手机
  • vscode查询项目代码行数

    vscode版本 4 13 1 1 打开vscode搜索 2 在输入框中输入 b b 并选择输入框内第三个图标使用正则表达式 3 结果出来了 最近知道了另外一个方法 使用命令行进行统计 例如只统计src内代码行数 直接使用git bash执
  • MySQL:explain结果中Extra:Impossible WHERE noticed after reading const tables

    MySQL explain结果中Extra Impossible WHERE noticed after reading const tables 前情提要 出现的情况 原因 前情提要 今天上午有同事突然找我 向我反馈说在对MySQL中的语