8.2.1.3 Range Optimization 

范围访问方法使用一个单个的索引来检索表记录的自己,包含在一个或者索引值区间。

它可以用于一个单独的部分或者多个部分的索引,下面章节给出了一个详细的描述关于如何从WHERE 子句中提取区间

8.2.1.3.1  范围访问方法用于单部分索引

对于一个单部分索引,索引值区间可以方便的体现通过相应的条件在WHERE子句,表示为范围条件,而不是"间隔"

单个range 条件定义对于一个单部分索引如下:

1. 对于BTREE和HASH 索引,key和恒定值比较是一个范围条件 当使用=,<=> in ,is NULL或者IS NOT NULL操作

此外, 对于BTREE 索引, key和常值比较是一个条件当使用e >, <, >=, <=, BETWEEN, !=, or <>操作或者LIKE 比较

如果参数to like 是一个常量 不是以一个通配符开始

对于所有index type, 多个range 条件集合OR或者AND 为一个range 条件

常量值在前面的描述意味着下面:

1.从查询字符串中的常量

2.一个常量或者系统表的列从相同关联

3.一个无关联子查询结果

4.任何表达式组成整个从之前类型的子表达式

这里有一些查询例子使用范围扫描在WHERE 子句:

SELECT * FROM t1
WHERE key_col > 1
AND key_col < 10; 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 尝试提取范围条件从WHERE 子句对于每个可能的indexes. 在提取过程中,条件不能被用于构造范围条件会被drop掉,条件产生重叠范围会被合并, 条件产生空的范围会被删除 考虑下面的语句,key1 是一个索引列,nonkey 没有被索引 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的提取过程: 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 '%b' 因为它们不能被用于一个范围扫描。 正确的方式是去掉它们替换它们使用TRUE, 因为我们不会丢失任何匹配的行当做一个范围扫描的时候,替换它们使用TRUE,我们得到: (key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR
(key1 < 'bar' AND TRUE) OR
(key1 < 'uux' AND key1 > 'z') 3.折叠的条件总是真的或者假的: (key1 LIKE 'abcde%' OR TRUE) is always true (key1 < 'uux' AND key1 > 'z') is always false 替换不必要的TRUE和FALSE常量,我们得到: (key1 < 'abc') OR (key1 < 'bar') 通常(和前面的例子所证明的),条件用于一个范围扫描是很少限制的相比WHERE 子句 MySQL 执行一个额外的检查来过滤出记录 来满足范围条件但是不能完整的WHERE 子句 范围条件提取算法可以处理 netsted and/or 随意深度的结构, 它的输出不依赖条件出现在WHERE 子句的顺序 MySQL 不支持 合并多个range 对于range 访问方法,要解决这个限制,你可以使用一个UNION 相同的SQL语句, 除非你放置每个谓词在不同的SELECT 语句 8.2.1.3.2 范围访问方法用于多部分索引: Range 条件在一个多部分多音是一个rang 条件的扩展, 一个range 条件在多部分索引限制索引记录位于一个或者多个key tuple 区间。 Key 区间是定义通过key 的集合 例如,考虑一个多部分索引定义为key1(key_part1, key_part2, key_part3) key_part1 key_part2 key_part3
NULL 1 'abc'
NULL 1 'xyz'
NULL 2 'foo'
1 1 'abc'
1 1 'xyz'
1 2 'abc'
2 1 'aaa' 条件 key_part1 =1 定义这个区间: (1,-inf,-inf) <= (key_part1,key_part2,key_part3) < (1,+inf,+inf) 对于B树索引,一个区间可能是用于条件集合AND,每个条件比较一个Key和一个常值 使用 =, <=>, IS NULL, >, <, >=, <=, !=, <>, BETWEEN, or LIKE 'pattern' (模式不是以一个通配符开始的) 一个区间可以用于确定一个单独的key 包含所有的记录,匹配条件(或者2个区间 如果 <> or != 被使用) 优化尝试使用额外的索引部分来决定区间只要比较表达式 是 =, <=>, or IS NULL. I 如果 操作符是>, <, >=, <=, !=, <>, BETWEEN, or LIKE, 优化器使用它不考虑更多的key 如果下面的表达式,优化器使用=从第一个比较, 它也使用>=从第2个比较表达式 但是不在考虑索引部分 key_part1 = 'foo' AND key_part2 >= 10 AND key_part3 > 10 多只比较 平等范围优化: 考虑表达式,col_names 是一个索引的列: col_name IN(val1, ..., valN) col_name = val1 OR ... OR col_name = valN 如果col_name 是等于任何几个值中的一个 ,那么每个表达式是真的。 那些表达式是等于范围比较(range 是一个单独的值) 优化器评估 读取符合记录的成本对于平等范围比较如下: 如果有一个唯一的索引在col_name,row 评估每个range 是1 因为最多一个记录可以有给定的值 否则,任何Index 在col_name 是非唯一的,优化器可以评估记录数对于每个range 使用

8.2.1.3 Range Optimization的更多相关文章

  1. MySQL Range Optimization

    8.2.1.3 Range Optimization MYSQL的Range Optimization的目的还是尽可能的使用索引 The range access method uses a sing ...

  2. 看懂mysql执行计划--官方文档

    原文地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html 9.8.2 EXPLAIN Output Format The EXP ...

  3. windows 下使用 zip安装包安装MySQL 5.7

    以下内容参考官方文档:http://dev.mysql.com/doc/refman/5.7/en/windows-start-command-line.html 解压缩zip到D:\mysql-5. ...

  4. optimizer hints

    In version MySQL 5.7.7 Oracle presented a new promising feature: optimizer hints. However it did not ...

  5. MYSQL EXPLAIN执行计划命令详解(支持更新中)

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所 ...

  6. MySQL--eq_range_index_dive_limit参数学习,MYSQL 5.6 5.7处理数据分布不均的问题

    官方文档如下描述:This variable indicates the number of equality ranges in an equality comparison condition w ...

  7. MySQL: Building the best INDEX for a given SELECT

    Table of Contents The ProblemAlgorithmDigressionFirst, some examplesAlgorithm, Step 1 (WHERE "c ...

  8. 数栈SQL优化案例:隐式转换

    MySQL是当下最流行的关系型数据库之一,互联网高速发展的今天,MySQL数据库在电商.金融等诸多行业的生产系统中被广泛使用. 在实际的开发运维过程中,想必大家也常常会碰到慢SQL的困扰.一条性能不好 ...

  9. Mysql优化(出自官方文档) - 第一篇(SQL优化系列)

    Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...

随机推荐

  1. yii console.php 报错 Property "CConsoleApplication.theme" is not defined.

    默认配置的话,是不会出现这个错误的,应该是有人为修改了 yiic.php 这个文件,本来是 $config 载入的应该是 console.php ,人为修改后载入了 main.php 这个配置文件了 ...

  2. Verilog中锁存器与多路选择器

    Verilog中锁存器与多路选择器 Verilog是一种硬件描述语言,它代表的是硬件. Verilog代表的就是逻辑门和连接线. 对于一个always@(*)控制的块而言,只要块中的表达式包含的任意的 ...

  3. MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题

    今天遇到一个奇怪的问题. 开发环境: 1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库 2. Visual Studio 2008 问题描述: 在 eclipse cdt 中 ...

  4. CSS选择符详解之关系选择符篇

    原文:http://www.chinaz.com/web/2012/1017/278553.shtml 相信大家都对CSS选择符都不陌生,选择符包含:元素选择符.关系选择符.属性选择符.伪类选择符.伪 ...

  5. 打jar包的方法

    打jar包的方法是什么? java打jar包,引用其他.jar文件 java项目打jar包 将java源码打成jar包 maven打jar例子 打war包的方法是什么? Eclipse->项目右 ...

  6. 关于华为交换机bpdu enable. ntdp enable. ndp enable解析

    华为5300初始状态下每个口子都有,bpdu enable. ntdp enable. ndp enable.不是很明白什么意思,有什么样的用途. BPDU是网桥协议数据单元(Bridge Proto ...

  7. Ubuntu桌面版与服务器版有什么不同?

         提到安装Linux,Ubuntu可谓是最受欢迎的.为了满足每个人的需求,出现了不少版本或风格的Ubuntu;其中两项便是桌面版与服务器版.只要发布版本号一致,这两者从核心来说也就是相同的,唯 ...

  8. 使用C#代码追加和提交文件到SVN服务器

    windows系统下使用svn的命令需要安装一个插件,下载地址:http://sourceforge.net/projects/win32svn/?source=typ_redirect 安装后程序会 ...

  9. java加载配置文件

    有时候一些变量可能会变,但直接写在程序代码中不好,因为有时候需要改的时候要改动源代码,这时候可以使用配置文件来管理.比如数据库中的端口和密码. 1. 把.properties配置文件放在src目录下. ...

  10. Android自定义扁平化对话框

    平时我们开发的大多数的Android.iOS的APP,它们的风格都是拟物化设计.如今Android 4.X.iOS 7.WP8采用的是扁平化设计,可以看出扁平化设计是未来UI设计的趋势.其实扁平化设计 ...