嗨,我有一个包含超过 200 万条记录的表。我想使用名为 venue_id
的外键对该表进行分区,这将加快我创建的一些报告的速度。
这是我尝试分区的表结构的图片。
我尝试运行此代码:
ALTER TABLE wifi_client_connection
PARTITION BY KEY(venue_id)
PARTITIONS 500;
但我不断收到此错误:主键必须包含表分区函数中的所有列
我已经研究了该错误,我认为这是因为 venue_id
不是唯一的,因为它是外键。
最佳答案
简短回答:不要分区。而是处理查询。
长答案:
注意:PARTITIONed
表中不允许使用FOREIGN KEY
。但是,它们生成的索引是允许的。
要解决该错误消息,只需将 pk 更改为
PRIMARY KEY(id, venue_id)
更好的索引集是将两个键替换为
PRIMARY KEY(venue_id, id) -- gets the clustering effect on venue_id
INDEX(id) -- keeps `AUTO_INCREMENT` happy.
不要对 INT(5)
中的 (5)
抱有任何期望。所有 INT
都是 4 字节整数。请参阅SMALLINT
;它是2个字节。 (等等)缩小表大小可能有助于提高性能。
向我们展示一份缓慢的报告;我们可以解释如何在不进行分区的情况下加快速度。
关于MYSQL使用外键对现有表进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51874950/