1.2:另外,对于Btree索引,index和一个常量值通过 ,<=,>=,between,!=,或者<>操作符做比较;

1.3: 对于所有类型的index,多范围条件通过 or and关键字组合形式;

'常量值'在之前的描述中意味着:

2.1:查询字符串的常量形式;

2.2: const 或者system表的一列(也只有一列)的自连接(join);

2.3: 不相关子查询的结果;

2.4: 有上面类型子表达式完全组成的任意表达式;

where子句范围查找的例子:

SELECT * FROMt1WHERE key_col > 1
AND key_col < 10;SELECT * FROMt1WHERE key_col = 1
OR key_col IN (15,18,20);SELECT * FROMt1WHERE key_col LIKE 'ab%'
OR key_col BETWEEN 'bar' AND 'foo';

一些非常量值可能在传播阶段转换为常量;

Mysql尝试对于在where子句中的任何可能的index提取range condition,在提取过程中,不能构造的范围条件被舍去,产生重叠的条件被组合,产生空范围的条件被舍去。

如下:

SELECT * FROM t1 WHERE(key1< 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR(key1< 'bar' AND nonkey = 4) OR(key1< 'uux' AND key1 > 'z');
key1为index, nonkey非index;

key1的提取过程如下:

1:从原始的where子句开始:

(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR(key1< 'bar' AND nonkey = 4) OR(key1< 'uux' AND key1 > 'z')

2:舍去nokey = 4和key1 like ‘%d’,因为他们不能用作范围scan,正确的舍去方法是用true代替她们,

(key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR(key1< 'bar' AND TRUE) OR(key1< 'uux' AND key1 > 'z')

3:  以下条件总是true or false;

1:(key1 LIKE 'abcde%' OR TRUE) is always true
2:(key1 < 'uux' AND key1 > 'z') is always false
(key1 < 'abc' AND TRUE) OR (key1 < 'bar' AND TRUE) OR (FALSE)

4: 去掉不必要的true 和false条件:

(key1 < 'abc') OR (key1 < 'bar')

5:组合那些重叠的区间成一个:

(key1 < 'bar')

范围条件的提取算法可以处理内嵌的and /or任意深度的构造,他的数去不依赖与他们出现在where子句中的顺序;

2:多part index的范围查询: