zoukankan      html  css  js  c++  java
  • 19.6 Restrictions and Limitations on Partitioning

    19.6 Restrictions and Limitations on Partitioning 约束和限制分区:

    19.6.1 Partitioning Keys, Primary Keys, and Unique Keys
    19.6.2 Partitioning Limitations Relating to Storage Engines
    19.6.3 Partitioning Limitations Relating to Functions
    19.6.4 Partitioning and Locking

    本节讨论MySQL 分区支持的限制

    禁止构造,下面的构造是不允许的在分区表达式:

    Stored procedures, stored functions, UDFs, or plugins.

    Declared variables or user variables.

    SQL 函数的列表, 允许在分区表达式 see Section 19.6.3, “Partitioning Limitations Relating to Functions”.

    算是运算和逻辑操作,使用算术运算操作+,-和*在分区表达式是允许的。 然而, 其结果必须是一个整数或者NULL

    DIV 操作符号也被支持, /操作是不被允许的

    HANDLER statements. In MySQL 5.6, the HANDLER statement is not supported with partitioned tables.

    Server SQL 模式, 表使用用户定义的分区不保持SQL 模式在有效的时间内,当它们被创建的时候

    在Section 5.1.7, “Server SQL Modes”, 很多的MySQL 函数和操作很多带便根据Server SQL mode 的结果,因此,

    SQL 模式里的一个改变在任何时间 在分区表创建后 肯呢过导致重大的变化 ,很容易导致数据损坏或丢失。由于这些原因,我们强烈建议您不要更改服务器SQL模式在创建分区表。

    例子,下面的例子 概述一些改变由于服务器SQL模式改变的一些变化:

    错误处理, 假设你创建一个分区表,分区表的表达式是 列DIV 0 或者列 MOD 0:

    mysql> CREATE TABLE tn (c1 INT)
    -> PARTITION BY LIST(1 DIV c1) (
    -> PARTITION p0 VALUES IN (NULL),
    -> PARTITION p1 VALUES IN (1)
    -> );
    Query OK, 0 rows affected (0.05 sec)

    默认的 MySQL 返回NULL 被0除后,不产生任何错误:

    被0除后,返回NULL
    mysql> INSERT INTO tn VALUES (NULL), (0), (1);
    Query OK, 3 rows affected (0.00 sec)
    Records: 3 Duplicates: 0 Warnings: 0

    然而,改变服务器的SQL 模式, 对待被0除后作为错误来严格执行错误处理,如下所示:

    mysql> SET sql_mode=’STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO’;
    Query OK, 0 rows affected (0.00 sec)

    mysql> INSERT INTO tn VALUES (NULL), (0), (1);
    ERROR 1365 (22012): Division by 0

    表可访问, 有时候 Server SQL模式的改变可能使分区表不可用, 下面的例子

    CREATE TABLE 语句可以被执行成功只有当NO_UNSIGNED_SUBTRACTION mode is in effect:

    mysql> SELECT @@sql_mode;
    +————+
    | @@sql_mode |
    +————+
    | |
    +————+
    1 row in set (0.00 sec)

    mysql> CREATE TABLE tu (c1 BIGINT UNSIGNED)
    -> PARTITION BY RANGE(c1 - 10) (
    -> PARTITION p0 VALUES LESS THAN (-5),
    -> PARTITION p1 VALUES LESS THAN (0),
    -> PARTITION p2 VALUES LESS THAN (5),
    -> PARTITION p3 VALUES LESS THAN (10),
    -> PARTITION p4 VALUES LESS THAN (MAXVALUE)
    -> );
    ERROR 1563 (HY000): Partition constant is out of partition function domain

    mysql> SET sql_mode=’NO_UNSIGNED_SUBTRACTION’;
    Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT @@sql_mode;
    +————————-+
    | @@sql_mode |
    +————————-+
    | NO_UNSIGNED_SUBTRACTION |
    +————————-+
    1 row in set (0.00 sec)

    mysql> CREATE TABLE tu (c1 BIGINT UNSIGNED)
    -> PARTITION BY RANGE(c1 - 10) (
    -> PARTITION p0 VALUES LESS THAN (-5),
    -> PARTITION p1 VALUES LESS THAN (0),
    -> PARTITION p2 VALUES LESS THAN (5),
    -> PARTITION p3 VALUES LESS THAN (10),
    -> PARTITION p4 VALUES LESS THAN (MAXVALUE)
    -> );
    Query OK, 0 rows affected (0.05 sec)

    如果你移除NO_UNSIGNED_SUBTRACTION server SQL 模式 在创建tu表后, 你可能不能在访问:

    mysql> SELECT * FROM tu;
    ERROR 1563 (HY000): Partition constant is out of partition function domain
    mysql> INSERT INTO tu VALUES (20);
    ERROR 1563 (HY000): Partition constant is out of partition function domain

    Server 的SQL模式也影响分区表的复制, 不同的SQL模式在master和slave上能导致分区表达式被不同的求值。

    这个会导致数据分布在不同分区不同在master和slave的copy,可能会导致在master上插入分区成功,在slave上失败。

    最好的结果,你应该总是使用相同的SQL模式在master和slave上。

    性能考虑,在以下列表中给出了分区操作对性能的影响:

    文件系统操作, 表分区和重新分区操作( 比如ALTER TABLE with PARTITION BY …, REORGANIZE PARTITIONS, or REMOVE PARTITIONING)

    依赖文件系统操作的实现。这意味着 那些操作的速度是有文件系统的类型和特性决定的,磁盘的速度,swap 空间 ,操作系统的文件处理效率,

    和MySQL SERVER 文件处理相关的选项和变量。特别是,你应该确保large_files_support 被启用, open_files_limit 设置正确。

    对于分区表使用 MyISAM storage engine, 增加myisam_max_sort_file_size 可能改善性能, 分区和重新分区操作

    设计InnoDB 表可能有效的 通过启动innodb_file_per_table。

    MyISAM 和分区文件描述符使用, 对于MyISAM 的分区表, 对于这样的表被打开后,MySQL 使用2个文件描述符用于每个分区.

    这意味着 你需要更多的文件描述符来执行操作在一个MyISAMde 分区表,相比没有分区的表,特别是执行ALTER TABLE操作:

    假设一个MyISAM 表T 有100个分区,SQL语句创建如下:

    CREATE TABLE t (c1 VARCHAR(50))
    PARTITION BY KEY (c1) PARTITIONS 100
    ENGINE=MYISAM;

    注意:

    为简洁起见, 我们使用KEY 分区,但文件描述符使用应用于所有的MyISAM 表分区,使用InnoDB的分区表不受这个问题影响。

    现在假设你希望重新分区 T表(有101个分区),使用语句如下:

    ALTER TABLE t PARTITION BY KEY (c1) PARTITIONS 101;

    处理ALTER TABLE 语句, MySQL 使用402个文件描述符, 原来的100个原始分区每个使用2个文件描述符,加上新的101个分区每个2个。

    这个是由于所有的分区(不管是老的还是新的),必须同时打开在重组表的时候。必须确保open-files-limit 不能设置太低。

    table locks: 处理执行一个分区操作需要write lock , 从表中读取相对不受影响, 挂起INSERT 和UPDATE 操作 当分区操作完成后。

    存储引擎:分区操作, 查询和更新操作通常倾向于 MyISAM 表比InnoDB 快:

    indexes; 分区裁剪。 与分分区表相比,正确的使用索引可以加快查询。此外,设计分区表能利用分区裁剪来改变性能。

    See Section 19.4, “Partition Pruning”, for more information.

    加载数据性能,在MySQL 5.6, load data 使用buffer 来改善性能。你需要知道使用每个分区130KB内存来实现

    最大的分区数, Mysql 5.6.7之前,最大的分区数对于一个不使用NDB 存储引擎是1024,在5.6.7 这个限制提高到8192

    如果当创建有大量分区的表时( 但是小于最大值),

    会遇到一个错误 比如Got error, 超出打开文件的资源限制,你可以通过增加open_files_limit 的值来解决这个问题。

    然而,这个是依赖操作系统,不可能在所有的平台上都肯呢过获取。

    不支持 Query cache,分区表不支持查询。 从MySQL 5.6.5开始,query cache 是自动关闭查询调用分区表,

    无法启用。

    Per-partition key caches, 在MySQL 5.6,key caches 被支持在MyISAM 分区表,使用2个文件描述符用于每个分区

    CACHE INDEX 和LOAD INTO CACHE语句, Key caches 可能被定义一个,多个或者所有的分区, indexes 对于1个,多个,

    或者所有的分区预先加载到key caches.

    外键不支持 InnoDB 分区表, 分区表使用InnoDB 存储引擎不支持外键,更具体的说,这意味着下面的陈述是真实的:

    1.没有定义的InoDB 分区表使用用户定义的分区可能包含外键,没有InnoDB 表定义了外键约束的会被分区

  • 相关阅读:
    UPC2018组队训练赛第十二场
    ACM-ICPC 2018南京赛区网络预选赛
    UPC2018组队训练赛第十一场
    UPC2018组队训练赛第十场
    UPC2018组队训练赛第九场
    linux 用简单密码
    设置分辨率
    packstack
    rbenv
    elasticsearch
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13351452.html
Copyright © 2011-2022 走看看