当前位置: 首页 > news >正文

50 mysql 的 “where 1 = 1“ 的优化处理

前言

问题是来自于 chinaunix 问题 ”mysql查询后面加 where 1 = 1 影响效率吗?”

mysql 中在 java 代码中我们经常会使用到 ”where 1 = 1 and username = ‘jerry’ ” 之类的条件 

然后 我们这里 来看一下 “where 1 = 1” 的相关处理 

 

 

where 条件在 select_lex, QUP_shared 中的存储

执行 sql 如下 “select *, 2, 2, 2 from tz_test where id = 1;”

sql_lex 中存储的原始查询语句中的查询条件 

因为这里是基于索引的查询, 查询条件放到了 qep_tab->m_qs->m_ref 中 

Qep->tab->m_qs->m_condition 中存储的额外的查询条件为 NULL

5e04219898b343772325718bd7d8cde9.png

 

执行 sql 如下 “select *, 2, 2, 2 from tz_test where field1 = 'field1';”

sql_lex 中存储的原始查询语句中的查询条件 

因为这里是基于索引的查询, 查询条件放到了 qep_tab->m_qs->m_ref 中 

Qep->tab->m_qs->m_condition 中存储的额外的查询条件为 NULL

394ae655c9a34e71bbfe4d667a2fc267.png

 

执行 sql 如下 “select *, 2, 2, 2 from tz_test where field2 = '1';”

sql_lex 中存储的原始查询语句中的查询条件 

因为这里是不是基于索引的查询, 查询条件放到了 qep_tab->m_qs->m_ref 为 NULL 

Qep->tab->m_qs->m_condition 中存储的的查询条件为 “where field2 = '1'”

9785be0c72a25e3f4b2027ee90aead3a.png

 

执行 sql 如下 “select *, 2, 2, 2 from tz_test where rand() > 0.4;”

sql_lex 中存储的原始查询语句中的查询条件 

因为这里是不是基于索引的查询, 查询条件放到了 qep_tab->m_qs->m_ref 为 NULL 

Qep->tab->m_qs->m_condition 中存储的的查询条件为 “where rand() > 0.4”

012784f06128318197a1f126419d661c.png

 

执行 sql 如下 “select *, 2, 2, 2 from tz_test where '1' = '1';”

sql_lex 中存储的原始查询语句中的查询条件 

因为这里是不是基于索引的查询, 查询条件放到了 qep_tab->m_qs->m_ref 为 NULL 

Qep->tab->m_qs->m_condition 中存储的的查询条件为 NULL, 因为在之前的 optimize的过程中查询条件被优化了 

4695d635833fb7de30cb26448ecbe166.png

 

 

select_lex -> JOIN -> QEP_shared  

select_lex 传递 where_cond 到 JOIN

f38cc2be5c7e163483cade8284fa9ca3.png

 

JOIN 传递 where_cond 到 QEP_shared

46ec333b88d7294887ffb638bdfddd26.png 

 

JOIN optimize 的过程中 where_cond 的清理 

条件的清理是在这里, 这里判断出来的 ”where 1 = 1” 恒为 true 

然后 这里的 ”*returncond = NULL” 就是清理掉条件 

2f5ce09021855231da604cfbbdb894bd.png

 

”*returncond = NULL” 执行了之后, JOIN->where_cond 更新为了 NULL

然后 导致 向后面的 table_ref, m_condition 传递存在问题 

70e7966330b8c9a03e6b7a8283076a5a.png

 

 

 

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 开启智能能效管理:4G 智能计量控制插座的协议对接与私有化部署
  • 36、Python之面向对象:容器类协议与collections.abc
  • Android进阶之路 - app后台切回前台触发超时保护退出登录
  • Java Web —— 第四天(HTTP协议,Tomcat)
  • 关于RCE
  • 白骑士的Matlab教学附加篇 5.2 代码规范与最佳实践
  • vue.config.js 配置多入口文件
  • LVS负载均衡集群部署之—NAT模式的介绍及搭建步骤
  • DBAPI如何用SQL查询出类似嵌套JSON的树状结构数据(例如省市区父子结构数据)
  • 开源力量,智领云KDP为大数据处理领域注入云原生活力
  • [C++内存管理]new,delete,operator new,opreator delete
  • 生成随机字符串(字母+数字)-批发行业进销存- PHP源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构
  • Redis7.0.15 主从复制、哨兵模式搭建
  • Topsis法模型(评价类问题)
  • Sql Server索引的创建及优化
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • codis proxy处理流程
  • Git 使用集
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • MQ框架的比较
  • php ci框架整合银盛支付
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • react-native 安卓真机环境搭建
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 创建一个Struts2项目maven 方式
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 关于使用markdown的方法(引自CSDN教程)
  • 前端设计模式
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 区块链将重新定义世界
  • 三分钟教你同步 Visual Studio Code 设置
  • 使用 QuickBI 搭建酷炫可视化分析
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 项目管理碎碎念系列之一:干系人管理
  • 一天一个设计模式之JS实现——适配器模式
  • 用 Swift 编写面向协议的视图
  • 优化 Vue 项目编译文件大小
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # Panda3d 碰撞检测系统介绍
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #图像处理
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (19)夹钳(用于送货)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)关于pipe()的详细解析