日期:2014-05-16 浏览次数:21203 次
参考博文:http://www.sziwap.com/wordpress/archives/10
?
对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的朋友可以去官方网站
查阅。供以后参考用:
本文测试的版本
mysql> select version();
+------------+
| version()? |
+------------+
| 5.1.33-log |
+------------+
1 row in set (0.00 sec)
一、关于Partitioning Keys, Primary Keys, and Unique Keys的限制
在5.1中分区表对唯一约束有明确的规定,每一个唯一约束必须包含在分区表的分区键(也包括主键约束)。
这句话也许不好理解,我们做几个实验:
CREATE TABLE t1
(????? id INT NOT NULL,
?????? uid INT NOT NULL,
?????? PRIMARY KEY (id)
)
PARTITION BY RANGE (id)
(PARTITION p0 VALUES LESS THAN(5) ENGINE = INNODB,
?PARTITION p1 VALUES LESS THAN(10) ENGINE = INNODB
);
?
CREATE TABLE t1
(????? id INT NOT NULL,
?????? uid INT NOT NULL,
?????? PRIMARY KEY (id)
)
PARTITION BY RANGE (id)
(PARTITION p0 VALUES LESS THAN(5) ENGINE = MyISAM DATA DIRECTORY='/tmp' INDEX DIRECTORY='/tmp',
?PARTITION p1 VALUES LESS THAN(10) ENGINE = MyISAM DATA DIRECTORY='/tmp' INDEX DIRECTORY='/tmp'
);
?
mysql> CREATE TABLE t1
??? -> (????? id INT NOT NULL,
??? ->??????? uid INT NOT NULL,
??? ->??????? PRIMARY KEY (id),
??? ->??????? UNIQUE KEY (uid)
??? -> )
??? -> PARTITION BY RANGE (id)
??? -> (PARTITION p0 VALUES LESS THAN(5),
??? ->? PARTITION p1 VALUES LESS THAN(10)
??? -> );
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function
二、关于存储引擎的限制
2.1 MERGE引擎不支持分区,分区表也不支持merge。
2.2 FEDERATED引擎不支持分区。这限制可能会在以后的版本去掉。
2.3 CSV引擎不支持分区
2.4 BLACKHOLE引擎不支持分区
2.5 在NDBCLUSTER引擎上使用分区表,分区类型只能是KEY(or LINEAR KEY) 分区。
2.6 当升级MYSQL的时候,如果你有使用了KEY分区的表(不管是什么引擎,NDBCLUSTER除外),那么你需要把这个表dumped在 reloaded。
2.7 分区表的所有分区或者子分区的存储引擎必须相同,这个限制也许会在以后的版本取消。
不指定任何引擎(使用默认引擎)。
所有分区或者子分区指定相同引擎。
三、关于函数的限制
在mysql5.1中建立分区表的语句中,只能包含下列函数:
ABS()
CEILING() and FLOOR() (在使用这2个函数的建立分区表的前提是使用函数的分区键是INT类型),例如
mysql> CREATE TABLE t (c FLOAT) PARTITION BY LIST( FLOOR(c) )(
??? -> PARTITION p0 VALUES IN (1,3,5),
??? -> PARTITION p1 VALUES IN (2,4,6)
??? -> );;
ERROR 1491 (HY000): The PARTITION function returns the wrong type
?
mysql> CREATE TABLE t (c int) PARTITION BY LIST( FLOOR(c) )(
??? -> PARTITION p0 VALUES IN (1,3,5),
??? -> PARTITION p1 VALUES IN (2,4,6)
??? -> );
Query OK, 0 rows affected (0.01 sec)
DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
DATEDIFF()
EXTRACT()
HOUR()
MICROSECOND()
MINUTE()
MOD()
MONTH()
QUARTER()
SECOND()
TIME_TO_SEC()
TO_DAYS()
WEEKDAY()
YEAR()
YEARWEEK()
四、其他限制
4.1 对象限制
下面这些对象在不能出现在分区表达式
Stored functions, stored procedures, UDFs, or plugins.
Declared variables or user variables.
4.2 运算限制
支持加减乘等运算出现在分区表达式,但是运算后的结果必须是一个INT或者NULL。 |, &, ^, <<, >>, , ~ 等不允许出现在分区表达式。
4.3 sql_mode限制
官方强烈建议你在创建分区表后,永远别改变mysql的sql_mode。因为在不同的模式下,某些函数或者运算返回的结果可能会不一样。
4.4 Performance considerations.(省略)
4.5 最多支持1024个分区,包括子分区。
当你建立分区表包含很多分区但没有超过1024限制的时候,如果报错 Got error 24 from storage engine,那意味着你需要增大open_files_limit参数。
4.6 不支持外键。MYSQL中,INNODB引擎才支持外键。
4.7 不支持FULLTEXT indexes(全文索引),包括MYISAM引擎。
mysql> CREATE TABLE articles (
??? -> id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
??? -> title VARCHAR(200),
??? -> body TEXT,
??? -> FULLTEXT (title,body)
??? -> )