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

前言

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

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

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

w here 条件在 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

执行 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

执行 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'"

执行 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"

执行 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的过程中查询条件被优化了

select_lex -> JOIN -> QEP_shared

select_lex 传递 where_cond 到 JOIN

JOIN 传递 where_cond 到 QEP_shared

J OIN optimize 的过程中 where_cond 的清理

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

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

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

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

相关推荐
菀亓11 小时前
ubuntu系统mysql安装
mysql
程序员贺加贝11 小时前
别被 saveBatch 骗了:一次 MyBatis-Plus 批量插入性能排查
mysql
l12586511 小时前
# RAG上线评估指标体系:六大核心指标与压测实战全解析
数据库·人工智能·python·mysql·langchain·milvus
宠友信息11 小时前
IM系统开发技术路线分析,即时通讯源码助力快速搭建聊天应用
java·spring boot·redis·websocket·mysql·uni-app·vue
__zRainy__12 小时前
Node系列 · 数据库:单表查询
数据库·后端·mysql·node.js
AIMath~14 小时前
MVCC 与乐观锁,RR的本质
mysql
程序员夏洛15 小时前
MySQL 中的 MVCC 是什么?
数据库·mysql
山甫aa15 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
梦想不只是梦与想16 小时前
MySQL 中的用户管理
数据库·mysql·用户管理
程序员夏洛16 小时前
MySQL 中的日志类型有哪些?binlog、redo log 和 undo log 的作用和区别是什么?
数据库·mysql