MYSQL使用外键对现有表进行分区

标签 mysql partitioning

嗨,我有一个包含超过 200 万条记录的表。我想使用名为 venue_id 的外键对该表进行分区,这将加快我创建的一些报告的速度。

这是我尝试分区的表结构的图片。

Table Structure

我尝试运行此代码:

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/

相关文章:

php - 如何从消息表中查找最后一条消息并查找用户

mysql - 对表中的多个分区进行子分区

hadoop - 如何删除 Hive 中每个节点的分区限制?

Neo4j 分区

MySQL 按表行分区

python - 我们如何获取 pyspark 中数据帧的每个分区的样本?

mysql - 查找有关日期和标题的重复条目

mysql - 每分钟给出日期,每两提取一次

mysql - 如何在 SQL 中计算其他两个表列的值

php - 如何循环遍历 3 维数组以将数据插入数据库?