称为分区修剪的优化基于一个相对简单的概念,该概念可以描述为“ 不扫描没有匹配值的分区 ”。假设t1通过以下语句创建分区表 :

CREATE TABLE t1 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY RANGE( region_code ) (

PARTITION p0 VALUES LESS THAN (64),

PARTITION p1 VALUES LESS THAN (128),

PARTITION p2 VALUES LESS THAN (192),

PARTITION p3 VALUES LESS THAN MAXVALUE

);

假设您希望从这样的SELECT语句中获得结果 :

SELECT fname, lname, region_code, dob

FROM t1

WHERE region_code > 125 AND region_code < 130;

很容易看出,应该返回的行都不在分区p0或 p3;中。也就是说,我们只需要在分区中搜索 p1并p2找到匹配的行。通过限制搜索,与扫描表中的所有分区相比,查找匹配的行可以花费更少的时间和精力。这种“ 切掉 ”不需要的分区被称为 修剪。当优化程序可以在执行此查询时使用分区修剪时,对于包含相同列定义和数据的未分区表,查询的执行速度可以比同一查询快一个数量级。

只要WHERE条件可以减少到以下两种情况之一,优化器就可以执行修剪 :

partition_column = constant

partition_column IN (constant1, constant2, ..., constantN)

在第一种情况下,优化器仅对给定值的分区表达式求值,确定哪个分区包含该值,然后仅扫描该分区。在许多情况下,等号可以与另一个算术比较来代替,包括, <=,>=,和 <>。使用某些查询 BETWEEN中WHERE子句也可以利用分区修剪。请参阅本节后面的示例。

在第二种情况下,优化器为列表中的每个值评估分区表达式,创建匹配分区的列表,然后仅扫描此分区列表中的分区。

SELECT, DELETE和 UPDATE语句支持分区修剪。一条INSERT语句对插入的每一行也只能访问一个分区。即使对于由HASH或进行 分区的表也是如此,KEY尽管当前未在中显示EXPLAIN。

修剪还可以应用于短范围,优化程序可以将其转换为等效的值列表。例如,在前面的示例中,WHERE子句可以转换为WHERE region_code IN (126, 127, 128, 129)。然后,优化器可以确定列表中的前两个值在partition中找到 p1,其余两个值在partition中 p2,并且其他分区不包含任何相关值,因此无需在匹配的行中进行搜索。

优化程序还可以对WHERE涉及使用RANGE COLUMNS或LIST COLUMNS分区的表的多个列上的前述类型进行比较的条件 进行修剪 。

只要分区表达式包含一个等于或可以减少为一组相等项的范围,或者当分区表达式表示增加或减少的关系时,都可以应用这种类型的优化。当分区表达式使用or 函数时,修剪还可以应用于在 DATE或 DATETIME列上分区的表 。当分区表达式使用该函数时,修剪也可以应用于此类表。 YEAR()TO_DAYS()TO_SECONDS()

假设使用以下所示的语句创建t2分区在表上的 表DATE:

CREATE TABLE t2 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY RANGE( YEAR(dob) ) (

PARTITION d0 VALUES LESS THAN (1970),

PARTITION d1 VALUES LESS THAN (1975),

PARTITION d2 VALUES LESS THAN (1980),

PARTITION d3 VALUES LESS THAN (1985),

PARTITION d4 VALUES LESS THAN (1990),

PARTITION d5 VALUES LESS THAN (2000),

PARTITION d6 VALUES LESS THAN (2005),

PARTITION d7 VALUES LESS THAN MAXVALUE

);

以下语句using t2可以利用分区修剪:

SELECT * FROM t2 WHERE dob = '1982-06-23';

UPDATE t2 SET region_code = 8 WHERE dob BETWEEN '1991-02-15' AND '1997-04-25';

DELETE FROM t2 WHERE dob >= '1984-06-21' AND dob <= '1999-06-21'

对于最后一条语句,优化器还可以执行以下操作:

查找包含范围下限的分区。

YEAR('1984-06-21')产生1984在分区中找到 的值d3。

查找包含范围高端的分区。

YEAR('1999-06-21')计算结果为 1999,可在partition中找到 d5。

仅扫描这两个分区以及它们之间可能存在的任何分区。

在这种情况下,这意味着,只有分区 d3,d4以及 d5被扫描。其余分区可以安全地忽略(也可以忽略)。

重要

在针对分区表的语句条件中引用的 无效值DATE和DATETIME值WHERE均视为 NULL。这意味着诸如之类的查询 不会返回任何值(请参见Bug#40972)。 SELECT * FROM partitioned_table WHERE date_column < '2008-12-00'

到目前为止,我们仅查看了使用RANGE分区的示例 ,但是修剪也可以应用于其他分区类型。

考虑一个由分区的表LIST,其中分区表达式在增加或减少,例如t3此处所示的表。(在本示例中,为简洁起见,我们假设该 region_code列的值限制为1到10之间(包括1和10)。

CREATE TABLE t3 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY LIST(region_code) (

PARTITION r0 VALUES IN (1, 3),

PARTITION r1 VALUES IN (2, 5, 8),

PARTITION r2 VALUES IN (4, 9),

PARTITION r3 VALUES IN (6, 7, 10)

);

对于诸如之类的语句SELECT * FROM t3 WHERE region_code BETWEEN 1 AND 3,优化器确定在值1、2和3中找到的分区(r0和r1),并跳过其余的分区(r2和r3)。

对于用HASH或 进行分区的表,[LINEAR] KEY如果WHERE子句=针对分区表达式中使用的列使用简单关系,则也可以进行分区修剪。考虑这样创建的表:

CREATE TABLE t4 (

fname VARCHAR(50) NOT NULL,

lname VARCHAR(50) NOT NULL,

region_code TINYINT UNSIGNED NOT NULL,

dob DATE NOT NULL

)

PARTITION BY KEY(region_code)

PARTITIONS 8;

可以删除将列值与常量进行比较的语句:

UPDATE t4 WHERE region_code = 7;

修剪还可以用于短距离,因为优化程序可以将这种条件转化为IN 关系。例如,使用与t4 先前定义的相同的表,可以删除诸如此类的查询:

SELECT * FROM t4 WHERE region_code > 2 AND region_code < 6;

SELECT * FROM t4 WHERE region_code BETWEEN 3 AND 5;

在这两种情况下,WHERE子句均由优化器转换为WHERE region_code IN (3, 4, 5)。

重要

仅当范围大小小于分区数时才使用此优化。考虑以下语句:

DELETE FROM t4 WHERE region_code BETWEEN 4 AND 12;

中相应的范围WHERE子句涵盖9个值(4,5,6,7,8,9,10,11,12),但t4仅具有8个分区。这意味着DELETE 不能修剪。

当用HASH或 分区表时[LINEAR] KEY,修剪只能在整数列上使用。例如,此语句不能使用修剪,因为它dob是一 DATE列:

SELECT * FROM t4 WHERE dob >= '2001-04-14' AND dob <= '2005-10-15';

但是,如果表将年份值存储在 INT列中,则WHERE year_col >= 2001 AND year_col <= 2005可以删除具有的查询 。

如果表NDB被显式分区,则可以修剪使用提供自动分区的存储引擎的表,例如MySQL Cluster使用的存储引擎。

mysql2008r1_mysql8 参考手册-分区修剪相关推荐

  1. mysql 分区个数限制_mysql8 参考手册-分区的限制

    本节讨论了对MySQL分区支持的当前限制. 禁止使用的构造. 分区表达式中不允许以下构造: 存储过程,存储函数,UDF或插件. 声明的变量或用户变量. 有关分区表达式中允许的SQL函数的列表,请参见 ...

  2. AutoCAD 命令参考手册

    Auto CAD 命令参考手册 3D 创建三维多边形网格对象 3DARRAY 创建三维阵列 3DCLIP   启用交互式三维视图并打开"调整剪裁平面"窗口 3DCORBIT   启 ...

  3. Debian参考手册读书摘要

    Debian参考手册笔记 第1章 GNU/Linux教程 1.1.1 欢迎提示 /etc/motd中保存非GUI登录时的欢迎提示信息 Debian GNU/Linux jessie/sid foo t ...

  4. JAVA程序开发参考手册

    <!--包装数据类型 ->//javalangInteger--整数类 //bitCount方法--获取二进制补码中位的数量 int i = 10;int count = Integer. ...

  5. 金仓数据库 KingbaseES SQL 语言参考手册 (11. SQL语句:ABORT 到 ALTER INDEX)

    11. SQL语句:ABORT 到 ALTER INDEX 本章描述各种类型的SQL语句,由于类型较多,将按字母顺序排列分组.这是第一组SQL语句. 包含以下章节: SQL语句类型 SQL语句各章节是 ...

  6. 金仓数据库 KingbaseES SQL 语言参考手册 (13. SQL语句:ALTER SYNONYM 到 COMMENT)

    13. SQL语句:ALTER SYNONYM 到 COMMENT 本章包含以下SQL语句: ALTER SYNONYM ALTER SYSTEM ALTER TABLE ALTER TABLESPA ...

  7. Sphinx 0.9.9/Coreseek 3.2 参考手册

    Sphinx 0.9.9/Coreseek 3.2 参考手册 Sphinx--强大的开源全文检索引擎,Coreseek--免费开源的中文全文检索引擎 Copyright © 2006-2010 (co ...

  8. 前端新手必看的CSS参考手册

    CSS 参考手册定期通过所有主流浏览器进行测试. CSS 属性 CSS 属性组: 动画 背景 边框和轮廓 盒(框) 颜色 内容分页媒体 定位 可伸缩框 字体 生成内容 网格 超链接 行框 列表 外边距 ...

  9. PHP程序开发参考手册

    /**语句*/ //if语句--条件控制语句 <?php$num = 2011;if(($num%4)==0&&($num%100)!=0){echo "$num&qu ...

最新文章

  1. 《 嵌入式系统设计与实践》一一3.6 测试硬件(和软件)
  2. jquery 选择器大全的详细说明和实例
  3. Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
  4. 扫地机器人欠压检测电路_扫地机器人智能家居必备!靠传感器感知外界环境?...
  5. Python稳基修炼之计算机等级考试易错概念题4(含答案与解析)
  6. Perl 6 真的太烦人了?
  7. 一款好看透明个人主页源码
  8. zbbz 坐标标注lisp_CAD_XY坐标标注AUTO_LISP程序
  9. golang 微信小程序登录
  10. Excel计算个人所得税公式
  11. C# + opengl + Tao 环境配置
  12. 【2018十大VR眼镜排行榜】VR眼镜有哪些品牌。哪个牌子的VR眼镜比较好,性价比高,适合玩VR游戏的
  13. Javascript笔记大全02
  14. python算法习题(十):木材加工
  15. 千锋Flask学习笔记
  16. 1353016-70-2,DBCO-acid, DBCO-COOH,Dibenzocyclooctyne-acid酸官能化的环辛炔衍生物
  17. 0521课的预习任务 + 课堂笔记
  18. Map集合遍历常用方法总结,记得收藏哦
  19. Sensor简介(一):摄像头模组CCM的结构和原理简述
  20. 学习UE4动画蓝图:实现双脚贴地

热门文章

  1. python(matplotlib7)——subplot 一个figure中国显示几个小图 分格显示
  2. python(numpy,pandas6)——pandas数据形式的简介,排序方式sort_index,sort_values
  3. 详解Linux的压缩解压缩命令
  4. 一文带你了解java面向对象的三大特性:继承、封装、多态
  5. 2.2.2 操作系统之进程调度的时机(主动放弃与被动放弃)、切换与过程(广义与狭义)、方式(非剥夺与剥夺)
  6. oracle游标指针移动时机,oracle--游标(cursor)
  7. python安装email模块_Python使用SMTP模块、email模块发送邮件
  8. 时间复杂度、渐进记法、主定理
  9. layui的css文件自己写的吗_安装教程和自己的使用tips
  10. x86架构linux内核引导过程分析,SylixOS---x86引导过程分析