本地唯一索引可以自动保证跨分区数据全局不重复。()
2 个赞
这个说法是错误的。
原因分析
本地唯一索引(Local Unique Index) 的索引数据是跟随分区表的每个分区独立存储的,每个分区维护自己独立的索引结构。因此,它只能保证单个分区内的数据唯一性,无法保证跨分区的全局唯一性。
举个例子:
-- 按 id 进行 HASH 分区
CREATE TABLE t1 (
id INT,
name VARCHAR(20),
UNIQUE KEY uk_id (id) LOCAL
) PARTITION BY HASH(id) PARTITIONS 4;
在这个例子中,id = 100 这条数据只会落在某一个分区中,所以碰巧不会重复。但如果唯一索引列不是分区键,情况就不同了:
CREATE TABLE t2 (
id INT,
email VARCHAR(50),
UNIQUE KEY uk_email (email) LOCAL
) PARTITION BY HASH(id) PARTITIONS 4;
这里按 id 分区,但唯一索引建在 email 上。同一条 email 值可能出现在不同分区中(因为不同 id 可能落在不同分区),而每个分区各自维护索引,无法感知其他分区中是否已存在相同的 email 值,因此无法保证全局唯一。
如何保证全局唯一?
如果需要跨分区的全局唯一性约束,应该使用全局唯一索引(Global Unique Index):
CREATE TABLE t2 (
id INT,
email VARCHAR(50),
UNIQUE KEY uk_email (email) GLOBAL
) PARTITION BY HASH(id) PARTITIONS 4;
全局索引独立于分区表的数据分布,维护一棵覆盖所有分区的统一索引树,能够真正保证全局唯一性。
1 个赞