快速业务通道

MySQL Internals Optimizer

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-18
)函数。或/sql/sql_select.cc,propagate_cond_constants()函数。

 

剔除死代码


 总是TRUE的条件会发生语句转化,如:

WHERE 0=0 AND column1=''y''
这种情况下,第一个条件会被剔除,最后为:


column1=''y''
 源代码见/sql/sql_select.cc,remove_eq_conds()。

 

 总是FLASE的条件也会发生语句转化,如:

WHERE (0 = AND s1 = OR s1 = 7
小括号和前两个条件总是FLASE,最后为:


WHERE s1 = 7

 

 还有一些情况下,当WHERE语句中代表不可能的条件,查询优化器可能会全部剔除语句,如下:

WHERE (0 = AND s1 = 5)
因为这条件永远不为TRUE,在EXPLAIN分析中会显示Impossible WHERE。简单地说,MySQL会说WHERE条件被优化过。


 

如果一个字段不能为NULL,优化器会剔除所有不相关的IS NULL的条件,这样

WHERE not_null_column IS NULL
这种条件总为FLASE情况;且


WHERE not_null_column IS NOT NULL
这种条件总为TRUE情况,所以这种字段查询的条件也被剔除。这种判断是很微妙的。举个例:在一个OUT JOIN外联接,被定义成NOT NULL字段仍然含有NULL值,优化器就会单独排除IS NULL条件在这种特殊情况中。

 

 优化器不会检查所有的Impossible WHERE的条件,因为这方面可能性太多了。例如:


CREATE TABLE Table1 (column1 CHAR(1));
...
SELECT * FROM Table1 WHERE column1 = ''Popgo'';
优化器不会剔除这种查询的条件,即使在CREATE TABLE定义中使之成为不可能的条件。


 

可合并的常数值


 如下表达式会发生语句转化:

WHERE column1 = 1 + 2
最后为:


WHERE column1 = 3
 在之前说的常数等值传递 ,优化器很容易将这种查询语句合并在一起。这操作就简化了结果。

 

常数值和常数表

 MySQL常数值,有时不单单指在查询的SQL语句的字面意思上,也可在常数表(constant tables)的内容里。常数表(constant tables)被定义为:

1。无记录或一条记录的表


2。表的表达式被WHERE条件约束,而且包含的表达式形式column = "constant",或者表的主键的所有字段,或者任何唯一键的所有字段(唯一键的字段定义为NOT NULL)


 例如,Table0表的定义包含:

... PRIMARY KEY (column1,column2)
 然后,查询表达式:


FROM Table0 ... WHERE column1=5 AND column2=7 ...
会返回常数表(constant tables)。更多简单地,如果Table1表的定义包含:


... unique_not_null_column INT NOT NULL UNIQUE
然后,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号