快速业务通道

MySQL Internals Optimizer

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-03-18
范围(range)或宽度内。这些称为范围条件,最常看到的是带>,>=,<,<=,IN,LIKE,BETWEEN的查询表达式。


 

 对优化器来说,如下表达式:

column1 IN (1,2,3)
和这个是一样的:


column1 = OR column1 = OR column1 = 3
 MySQL同样对待这种语句,无需对查询条件的IN到OR或OR到IN做转变。


 

 如下语句,优化器也会用到索引(范围查询range search)

column1 LIKE ''x%''
 但这种就不行:


column1 LIKE ''%x%''
 也就是说,如果匹配条件的第一个字符是通配符,那就没范围查询。

 

 同样,如下两个语句也是一样的

column1 BETWEEN 5 AND 7


column1 >= AND column1 <= 7

 

 如果查询的条件,检索了太多的索引键,优化器可能转变RANGE联接类型为ALL JOIN联接类型。像这种转变,特别可能在<和>条件和多级第二索引(secondary indexes)中。源代码见:/myisam/mi_range.c,mi_records_in_range()(MyISAM索引)。


 

 INDEX联接类型

 考虑这个查询

SELECT column1 FROM Table1;
如果column1有加索引,那优化器可能选择从加的索引取值,而不是从表(全表扫描)。像这种方式的索引,一般称为覆盖索引(COVERING INDEX)。在EXPLAIN Extra描述中,MySQL会简单用INDEX单词来表示覆盖索引(COVERING INDEX)。


 语句:

SELECT column1, column2 FROM Table1; 只有当索引被定义成如下,优化器会使用JOIN联接类型为INDEX:join type = index CREATE INDEX ... ON Table1 (column1, column2);
 换句话说,被查询的字段(如:column1, column2)都必需被加索引的,被加索引的多个字段是无顺序之分的。因此,更有意义的严格定义一个多列索引(multiple-column index)作为一个覆盖索引(COVERING INDEX)来使用,无论搜索的考虑。


 

 INDEX MERGE联接类型


概述

 使用索引合并(INDEX MERGE),当表的条件可转化成如下:


cond_1 OR cond_2 ... OR cond_N
 转化的条件是:每个cond_i(cond_1,cond_2。。。)条件可用于范围扫描,且没有一对条件(cond_i,cond_j)用相同的索引。如果cond_i和cond_j条件使用相同的索引,那么cond_i或者cond_j条件能结合一个单一范围扫描,也就没合并的必要了。


 

 如下查询就用了索引合并(INDEX MERGE):

SELECT * FROM t WHERE key1=c1 OR key2<c2 OR key3 IN (c3,c4);

SELECT * FROM t WHERE

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