欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

MySQL分区表的局限和限制得方法介绍

来源:本站整理 作者:佚名 时间:2017-06-29 TAG: 我要投稿

禁止构建
分区表达式不支持以下几种构建:
存储过程,存储函数,UDFS或者插件
声明变量或者用户变量
可以参考分区不支持的SQL函数
算术和逻辑运算符
分区表达式支持+,-,*算术运算,但是不支持DIV和/运算(还存在,可以查看Bug #30188, Bug #33182)。但是,结果必须是整形或者NULL(线性分区键除外,想了解更多信息,可以查看分区类型)。
分区表达式不支持位运算:|,&,^,<<,>>,~ .
HANDLER语句
在MySQL 5.7.1之前的分区表不支持HANDLER语句,以后的版本取消了这一限制。
服务器SQL模式
如果要用用户自定义分区的表的话,需要注意的是,在创建分区表时的SQL模式是不保留的。在服务器SQL模式一章中已经讨论过,大多数MySQL函数和运算符的结果可能会根据服务器SQL模式而改变。所以,一旦SQL模式在创建分区表后改变,可能导致这些表的行为发生重大变化,很容易导致数据丢失或者损坏。基于以上原因,强烈建议你在创建分区表后千万不要修改服务器的SQL模式。
举个例子来说明下上述情况:
1.错误处理
 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默认除以0的结果是NULL,而不是报错:
 mysql> SELECT @@sql_mode;
+------------+
| @@sql_mode |
+------------+
|   |
+------------+
1 row in set (0.00 sec)
 
mysql> INSERT INTO tn VALUES (NULL), (0), (1);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
然而如果我们修改SQL模式的话,就会报错:
 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

2.表辅助功能
有时候修改SQL模式可能会导致分区表不可用。比如有些表只有在SQL模式为NO_UNSIGNED_SUBTRACTION才发挥作用,比如:
 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)
如果你在创建tu后,修改SQL模式,就可能再也不能访问这个表了:
 mysql> SET sql_mode='';Query OK, 0 rows affected (0.00 sec)
 
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
服务器端的SQL模式也会影响分区表的复制。在主备间使用不同的SQL模式可能会导致分区表达式主备上执行是不同的结果(而在阿里主备切换是很正常的操作);这也会导致在主备复制过程中,不同分区间的数据分布不同;也有可能导致在主库上的分区表insert成功,而备库上失败。基于上述情况,最好的解决办法是保证主备间的SQL模式要保持一致(这个是DBA在运维过程中需要注意的)。
性能注意事项
下面是一些会影响分区操作性能的因素:
文件系统操作
 分区或者重新分区(比如ALTER TABLE ...PARTITION BY ..., REORGANIZE PARTITION, 或者REMOVE PARTITIONING )操作取决于文件系统的实现。意思是说上述操作会受操作系统上,比如:文件系统的类型和特性,磁盘速度,swap空间,操作系统上的文件处理效率,以及MySQL服务器上的和文件句柄相关的选项,变量等因素影响。需要特别说明的是,你需要保证large_files_support是enabled的,open_files_limit设置是合理的。对于MyISAM引擎的分区表来说,需要增加myisam_max_sort_file_size以提高性能;对于InnoDB表来说,分区或者重新分区操作通过enabled innodb_file_per_table效率会更快。
也可以参考分区的最大数量。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载