我正在使用 MySQL 5.5,并且我在生产中有一个存储客户交易的现有表。该表的简化版本是:
CREATE TABLE transactions (
id INT NOT NULL AUTO_INCREMENT,
description CHAR(100),
posted DATE,
PRIMARY KEY (id)
) ENGINE=MyISAM
我们正在探索在交易日期上使用分区的想法,以使使用日期过滤的报告执行得更快。由于MySQL 分区键文档中解释的主键和分区限制,以下尝试失败。
mysql> CREATE TABLE transactions (
-> id INT NOT NULL AUTO_INCREMENT,
-> description CHAR(100),
-> posted DATE,
-> PRIMARY KEY (id)
-> ) ENGINE=MyISAM
-> PARTITION BY HASH(MONTH(posted)) PARTITIONS 12;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
一种可能的解决方法如下:
CREATE TABLE transactions (
id INT NOT NULL AUTO_INCREMENT,
description CHAR(100),
posted DATE,
PRIMARY KEY (id, posted)
) ENGINE=MyISAM
PARTITION BY HASH(MONTH(posted)) PARTITIONS 12;
另一种解决方法是:
CREATE TABLE transactions (
id INT NOT NULL AUTO_INCREMENT,
description CHAR(100),
posted DATE,
KEY (id)
) ENGINE=MyISAM
PARTITION BY HASH(MONTH(posted)) PARTITIONS 12;
在这两种解决方法中,数据库都不会阻止具有相同 ID 但发布日期不同的多条记录的情况。有没有办法在发布的字段上使用分区并保持原始的唯一约束?