zoukankan      html  css  js  c++  java
  • 19.4 Partition Pruning 分区修剪

    19.4 Partition Pruning 分区修剪

    本节讨论了一种称为分区裁剪的优化方法。这个核心的章节是相对简单的,可以被描述为 “不扫描分区,当没有匹配的值”.

    CREATE TABLE t1 (
    region_code TINYINT UNSIGNED NOT NULL
    )
    PARTITION BY RANGE( region_code ) (
    PARTITION p0 VALUES LESS THAN (64), <64
    PARTITION p1 VALUES LESS THAN (128), 64-127
    PARTITION p2 VALUES LESS THAN (192), 128-191
    PARTITION p3 VALUES LESS THAN MAXVALUE
    );

    假设你有一个分区表 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 fname, lname, region_code, dob
    FROM t1
    WHERE region_code > 125 AND region_code < 130;

    显而易见, 返回的数据不包含在P0或P3分区, 我们只要检索P1和P2来找到匹配的数据。通过这样做,

    它会花费少的多的时间和精力来找到匹配的数据,相比扫描整个表的所有的分区。

    这种切割不必要的分区 称为分区裁剪。 当优化器可以使用分区裁剪来执行这个查询,查询执行时一个数量级的速度相比

    同样的查询

    注意:

    当对分区的MyISAM表执行分区裁剪, 所有的分区都是打开的,它们是否被检查,由于MyISAM 存储引擎的设计。

    这意味着你必须有足够的文件描述符,来覆盖所有的分区。

    这种限制不应用于分区表使用其他存储引擎的 比如InnoDB

    优化器可以执行裁剪,无论where 条件可以被降低到下面两个条件:

    partition_column = constant

    partition_column IN (constant1, constant2, …, constantN)

    在第一种情况下,该优化程序只对给定的值进行分区表达式的计算, 确定哪个分区包含值。

    只扫描这个分区,在很多cases,等号可以被另外的算术符号替换 包括 <,>,<=,>= 和<> .

    一些查询使用BETWEEN 在where 条件字句可以利用分区裁剪。

    在第2种情况下, 优化器计算分区表达式为每个值在列表里, 创建一个匹配分区的列表,

    然后只扫描在分区列表里的分区。

    MySQL 可以应用分区裁剪 ,应用于SELECT,DELETE和UPDATE 语句,insert语句当前不能被裁剪。

    裁剪也可以用于短的范围, 优化器会转化成等价的值的列表。例如, 在前面的例子中,

    WHERE 子句 可以转换成WHERE region_code IN (126, 127, 128, 129). 那么优化器可以确定前两个值在分区P1

    剩下的两个值 在分区 P2, 其他的分区可能不包含相关的值,不需要搜索匹配的行。

    在MySQL 5.6中,优化器也可以进行修剪的条件,包括比较上述类型对多个列的表列或表列分区的使用范围。

    这种类型的优化可以被应用于,不管分区表达式是否有等式或者一个范围组成,可以减少一组等式,

    或者当分区表达式表现为一个增加或者减少关系。

    分区裁剪也可以应用于表分区 在一个DATE或者DATETIME列,当分区表达式使用 YEAR() or TO_DAYS() 函数。

    此外, 在MySQL 5.6,分区裁剪可以用于于此类表 当分区表达式使用TO_SECONDS() function.

    假设表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
    );

    下面的语句使用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’

  • 相关阅读:
    微信支付v2开发(3) JS API支付
    微信支付v2开发(4) 交易通知
    微信支付v2开发(5) 订单查询
    JavaScript大文件上传解决方案实例代码
    JS大文件上传解决方案实例代码
    VUE大文件上传解决方案实例代码
    HTML大文件上传解决方案实例代码
    Web大文件上传解决方案实例代码
    .net大文件上传解决方案实例代码
    jsp大文件上传解决方案实例代码
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351455.html
Copyright © 2011-2022 走看看