快速业务通道

MySQL Internals Optimizer

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-18
n ||
        row doesn''t match clustered PK scan condition)
      put rowid into Unique;
  }
}
deactivate ''index only'';

 

行检索阶段:

for each rowid in Unique
{
  retrieve row and pass it to output;
}
if (clustered_pk_scan)
{
  while (retrieve next row for clustered_pk_scan)
   pass row to output;
}
源代码见:sql/opt_range.cc,QUICK_INDEX_MERGE_SELECT类函数的索引合并(INDEX MERGE)行检索代码。


 

3.换位(Transpositions)

 MySQL支持简单语句表达式的换位(反转关系操作符的操作数的顺序)。换句话说:

WHERE - 5 = column1
此语句可转化成:


WHERE column1 = -5

 

 然而,MySQL不支持有运算存在的换位,如:

WHERE 5 = -column1
而这句不能同等对待:


WHERE column1 = -5

 

 像这形式column = constant表达式的换位是为了更好的索引检索。如果这种形式的语句有加了索引的字段,不论表的大小,MySQL始终使用上索引的。(例外:如果表无记录或只有一行记录,它就是常数表,需特别处理。见常数值和常数表)。

 

 AND关系

 一个AND的查询形式如condition1 AND condition2,如下:

WHERE column1 = ''x'' AND column2 = ''y''
 这步骤描述了优化器决断的过程:

1。如果两个条件都没被索引,使用顺序扫描(全表扫描)。
2。除前一点之外,如果其中一个条件有更好的JOIN联接类型,则以JOIN联接类型选择一个驱动。(见确定JOIN联接类型)
3。除前两点之外,如果两个条件都有加索引且平等的JOIN联接类型(注:JON 联接类型效果有好坏之分),则以第一个创建的索引选择一个驱动。

 优化器也会根据索引交叉选择索引合并(INDEX MERGE),见 INDEX MERGE联接类型。 例子如下:


CREATE TABLE Table1 (s1 INT, s2 INT);
CREATE INDEX Index1 ON Table1 (s2);
CREATE INDEX Index2 ON Table1 (s1);
...
SELECT * FROM Table1 WHERE s1 = AND s2 = 5;
 当选择一种策略来解决这个查询,优化器会选择s2 = 5作为驱动,由于s2上的索引首先被创建。视为一个偶然的效果,而不是一种规则,在任何时刻都有可能会改变的。


 

 OR关系

 一个OR的查询形式如condition1 OR condition2,如下:

WHERE column1 = ''x'' OR column2 = ''y''
 这种查询优化器的决断是使用顺序全表扫描。

&nbs

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号