范围查询可以通过一个索引的单个或者多个索引值的区间来检索数据记录,也适用于符合索引。下面就区间是怎么样从where子句中被提取出来的作出详细解释。
使用单值索引的范围查询
对于单值索引来说索引值的区间能够很好地通过where子句中的相应条件很好的表示出来。
单值索引的范围查询被定义为:对于BTree索引和Hash索引来讲,包含索引键和 =, <=>, IN(), IS NULL 或者 IS NOT NULL 这些操作符的比较
此外对于BTree索引来讲还包含索引键和 >, =, <=, BETWEEN, !=, 或<>, 或 LIKE不以通配符开头的 这些操作符的比较
对于所有的索引类型,多个索引条件用 or 或者 and 组合的单个范围查询
下面这些是范围查询SELECT * FROM t1 WHERE key_col > 1 AND key_col
SELECT * FROM t1 WHERE key_col = 1 OR key_col IN (15,18,20);
SELECT * FROM t1 WHERE key_col LIKE 'ab%' OR key_col BETWEEN 'bar' AND 'foo';
一些非常量的值是可以被优化器转为常量的。
MySQL会在提取范围查询条件的时候会为每个索引提取。在提取的过程中,不能构成范围查询条件的将会被丢弃,重叠的范围查询条件将会被合并,构成空的范围查询的将会被移除。
参考下面的语句,key1 是被索引的, nonkey是没被索引的SELECT * FROM t1 WHERE
(key1
(key1
(key1 'z');