是否可以基于 char 列进行分区?
在查看 MySQL 5.1 文档后,似乎只能使用整数类型。
它是否正确?或者我可以使用一些函数将字符转换为整数吗?
有问题的 char 字段包含一个唯一标识符。
是否可以基于 char 列进行分区?
在查看 MySQL 5.1 文档后,似乎只能使用整数类型。
它是否正确?或者我可以使用一些函数将字符转换为整数吗?
有问题的 char 字段包含一个唯一标识符。
MySQL 5.1 中的分区只能处理整数列(Source)。您只能在非整数列上使用几个分区函数。例如:
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 中使用键分区,只要主键包括表的分区函数中的所有列:
CREATE TABLE k1 (
id CHAR(3) NOT NULL PRIMARY KEY,
value int
)
PARTITION BY KEY(id)
PARTITIONS 10;
另一方面,在 MySQL 5.5 中,您可以对各种数据类型(包括基于字符的列)使用范围列分区或列表列分区。
列出列示例:
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')
);
进一步阅读:
您希望通过 PARTITIONing 获得什么?HASH 和 LIST 不太可能提供任何性能提升。对少于一百万行的表进行分区很少有用。
关于分区的其他评论:http: //mysql.rjweb.org/doc.php/partitionmaint
5.6 和 5.7 放宽了其他答案中提到的一些限制,但分区仍然很少比索引好。