MYSQL 使用外键对现有 table 进行分区
MYSQL partitioning existing table using a foreign key
您好,我有一个 table,其中包含超过 200 万条记录。我想使用一个名为 venue_id
的外键对这个 table 进行分区,这将加快我创建的一些报告的速度。
这是我尝试分区的 table 结构的图片。
Table Structure
我试过运行这个代码:
ALTER TABLE wifi_client_connection
PARTITION BY KEY(venue_id)
PARTITIONS 500;
但是我一直收到这个错误:A PRIMARY KEY must include all columns in the table's partitioning function
我研究了这个错误,我认为这是因为 venue_id
不是唯一的,因为它是一个外键。
简短回答:不要分区。而是处理查询。
长答案:
注意:FOREIGN KEYs
不允许出现在 PARTITIONed
table 中。但是,它们生成的索引 是 允许的。
要避开错误消息,只需将 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)
抱有任何期望。所有 INTs
都是 4 字节整数。参见SMALLINT
;它是2个字节。 (等)缩小 table 大小可能有助于提高性能。
向我们展示一个缓慢的报告;我们可以解释如何在没有分区的情况下加速它。
您好,我有一个 table,其中包含超过 200 万条记录。我想使用一个名为 venue_id
的外键对这个 table 进行分区,这将加快我创建的一些报告的速度。
这是我尝试分区的 table 结构的图片。
Table Structure
我试过运行这个代码:
ALTER TABLE wifi_client_connection
PARTITION BY KEY(venue_id)
PARTITIONS 500;
但是我一直收到这个错误:A PRIMARY KEY must include all columns in the table's partitioning function
我研究了这个错误,我认为这是因为 venue_id
不是唯一的,因为它是一个外键。
简短回答:不要分区。而是处理查询。
长答案:
注意:FOREIGN KEYs
不允许出现在 PARTITIONed
table 中。但是,它们生成的索引 是 允许的。
要避开错误消息,只需将 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)
抱有任何期望。所有 INTs
都是 4 字节整数。参见SMALLINT
;它是2个字节。 (等)缩小 table 大小可能有助于提高性能。
向我们展示一个缓慢的报告;我们可以解释如何在没有分区的情况下加速它。