Mysql 分区 - 如何对包含唯一列的 table 进行列表分区?

Mysql partition - How to do list partitioning of a table that contains unique column?

我正在做 mysql 列表分区。我的table数据如下

----------------------------------------
id | unique_token | city | student_name |
----------------------------------------
1  | xyz          |mumbai| sanjay       |
-----------------------------------------
2  | abc          |mumbai| vijay        |
----------------------------------------
3  | def          | pune | ajay         |
----------------------------------------

在上面的 table unique_token 列中有一个唯一键,我想用 city 列进行列表分区。根据 mysql 文档,每个分区列都必须是 table 的每个唯一键的一部分,因此为了使用城市列进行列表分区,我必须创建新的唯一键作为 unique_key(unique_token,city)

现在的问题是 unique_token 列应该是唯一的,如果我在 table 中插入两行作为 ('xyz','banglore') and ('xyz','pune') 那么这些行将被插入到 table 但是 unique_token 列根本不会是唯一的。

我想知道如何在此 table 上进行列表分区而不在 unique_token 列中有重复数据??

最好为(unique_token 和城市)列提供复合主键

alter table table_name add constraint constraint_name primary key(unique_token and city).

MySQL 的 PARTITION 实施存在局限性。特别是,没有 FOREIGN KEYsUNIQUE 键,除非它们碰巧包含 "partition key"。这些限制的存在是因为实施它们的成本不可接受。反过来,这是由于每个分区本质上是一个单独的 'table',具有自己的索引。没有 "index" 跨越整个分区集。这样的 'global index' 将使 FK 和 UNIQUE 密钥可行且高效。此 可能 出现在版本 5.8 中。

同时,让我将您的问题从“如何 进行 LIST 分区...”更改为“为什么LIST 完全分区吗?”。对于 PARTITION BY LIST,我不知道有什么实用性——不是性能,不是方便,不是其他任何东西。如果您有想要这样做的理由, 解释。我很乐意改变我对分区的消极态度。 (我知道 只有 4 个用于 PARTITION BY RANGE 的用例,但这是另一个话题。)