MySQL能够支持建立分区表,利用分区表可以提升数据库的性能,创建分区表如下:
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’
);
分区表对唯一约束有明确的规定,每一个唯一约束必须包含在分区表的分区键(也包括主键约束)。
分区表对存储引擎的限制:MERGE引擎不支持分区,分区表也不支持merge;FEDERATED引擎不支持分区,这限制可能会在以后的版本去掉;CSV引擎不支持分区;BLACKHOLE引擎不支持分区;在NDBCLUSTER引擎上使用分区表,分区类型只能是KEY(or LINEAR KEY) 分区;当升级MYSQL的时候,如果你有使用了KEY分区的表(不管是什么引擎,NDBCLUSTER除外),那么你需要把这个表dumped在reloaded;分区表的所有分区或者子分区的存储引擎必须相同,这个限制也许会在以后的版本取消;不指定任何引擎(使用默认引擎);所有分区或者子分区指定相同引擎。
分区表对内置函数的限制,分区表中只能使用一下函数:
ABS()、CEILING()、FLOOR()、DAY()、DAYOFMONTH()、DAYOFWEEK()、DAYOFYEAR()、DATEDIFF()、EXTRACT()、HOUR()、MICROSECOND()、MINUTE()、MOD()、MONTH()、QUARTER()、SECOND()、TIME_TO_SEC()、TO_DAYS()、WEEKDAY()、YEAR()、YEARWEEK()
分区表的其他限制:
1. 对象限制:下面这些对象在不能出现在分区表达式
Stored functions, stored procedures, UDFs, or plugins.
Declared variables or user variables.
2. 运算限制:支持加减乘等运算出现在分区表达式,但是运算后的结果必须是一个INT或者NULL。 |, &, ^, <<, >>, , ~ 等不允许出现在分区表达式。
sql_mode限制:官方强烈建议你在创建分区表后,永远别改变mysql的sql_mode。因为在不同的模式下,某些函数或者运算返回的结果可能会不一样。
3. Performance considerations。(省略)
4. 分区数量限制:
最多支持1024个分区,包括子分区。
5. 当你建立分区表包含很多分区但没有超过1024限制的时候,如果报错 Got error 24 from storage engine,那意味着你需要增大open_files_limit参数。
6. 不支持外键。MYSQL中,INNODB引擎才支持外键。
7. 不支持FULLTEXT indexes(全文索引),包括MYISAM引擎。
8. 不支持spatial column types。
9. 临时表不能被分区。
10. log table不支持分区
11. 分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL。唯一的例外是当分区类型为KEY分区的时候,可以使用其他类型的列作为分区键( BLOB or TEXT 列除外)。
12. 分区键不能是一个子查询。 A partitioning key may not be a subquery, even if that subquery resolves to an integer value or NULL
13. 只有RANG和LIST分区能进行子分区。HASH和KEY分区不能进行子分区。
14. 分区表不支持Key caches。
15. 分区表不支持INSERT DELAYED。
16. DATA DIRECTORY和INDEX DIRECTORY参数在分区表将被忽略。这个限制应该不存在了:
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’
);
17. 分区表不支持mysqlcheck和myisamchk。在5.1.33版本中已经支持mysqlcheck和myisamchk。
18. 分区表的分区键创建索引,那么这个索引也将被分区。分区键没有全局索引一说。
19. 在分区表使用ALTER TABLE … ORDER BY,只能在每个分区内进行ORDER BY。
本篇文章绝大部分来自互联网,非原创,囧。引用地址点击此处。
