如何基于char列对MySQL表进行分区?

时间:2010-09-20 16:10:33

标签: mysql database-partitioning

是否可以基于char列进行分区?

在查看MySQL 5.1文档后,似乎只能使用整数类型。

这是对的吗?或者我可以使用某些函数将char转换为整数吗?

有问题的字段包含唯一标识符。

2 个答案:

答案 0 :(得分:15)

MySQL 5.1中的分区只能处理整数列(Source)。您只能在非整数列上使用few partitioning functions。例如:

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE)
   ENGINE=INNODB
   PARTITION BY HASH( MONTH(tr_date) )
   PARTITIONS 6;

您也可以在MySQL 5.1中使用key partitioning,只要主键包含表格分区功能中的所有列:

CREATE TABLE k1 (
   id CHAR(3) NOT NULL PRIMARY KEY,
   value int
)
PARTITION BY KEY(id)
PARTITIONS 10;

另一方面,在MySQL 5.5中,您可以对各种数据类型使用range column partitioninglist column partitioning,包括基于字符的列。

列出列示例:

CREATE TABLE expenses (
   expense_date DATE NOT NULL,
   category VARCHAR(30),
   amount DECIMAL (10,3)
);

ALTER TABLE expenses
PARTITION BY LIST COLUMNS (category)
(
   PARTITION p01 VALUES IN ('lodging', 'food'),
   PARTITION p02 VALUES IN ('flights', 'ground transportation'),
   PARTITION p03 VALUES IN ('leisure', 'customer entertainment'),
   PARTITION p04 VALUES IN ('communications'),
   PARTITION p05 VALUES IN ('fees')
);

范围列示例:

CREATE TABLE range_test (
   code CHAR(3),
   value INT
)
PARTITION BY RANGE COLUMNS(code) (
   PARTITION p0 VALUES LESS THAN ('MMM'),
   PARTITION p1 VALUES LESS THAN ('ZZZ')
);

进一步阅读:

答案 1 :(得分:0)

你希望通过PARTITIONing获得什么? HASH和LIST不太可能提供任何性能提升。对少于一百万行的表进行分区很少有用。

有关分区的其他评论:http://mysql.rjweb.org/doc.php/partitionmaint

5.6和5.7放宽了其他答案中提到的一些限制,但仍然分区很少比索引好。