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 传递存在问题

相关推荐
得物技术10 小时前
破解gh-ost变更导致MySQL表膨胀之谜|得物技术
数据库·后端·mysql
Java水解11 小时前
【MySQL】从零开始学习MySQL:基础与安装指南
后端·mysql
沢田纲吉15 小时前
🗄️ MySQL 表操作全面指南
数据库·后端·mysql
Java水解1 天前
Mysql查看执行计划、explain关键字详解(超详细)
后端·mysql
知其然亦知其所以然2 天前
MySQL 社招必考题:如何优化查询过程中的数据访问?
后端·mysql·面试
DemonAvenger2 天前
NoSQL与MySQL混合架构设计:从入门到实战的最佳实践
数据库·mysql·性能优化
程序新视界2 天前
如何在MySQL中创建聚集索引?
mysql
AAA修煤气灶刘哥2 天前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
程序新视界2 天前
学习MySQL绕不开的两个基础概念:聚集索引与非聚集索引
mysql
RestCloud2 天前
跨境数据传输:ETL如何处理时区与日期格式差异
mysql·api