幽客
#1
obclient> CREATE TABLE tbl2_f_rl(col1 INT,col2 INT)
PARTITION BY RANGE(col1) SUBPARTITION BY LIST(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES IN(1,3),
SUBPARTITION sp1 VALUES IN(4,6)),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp3 VALUES IN(1,3),
SUBPARTITION sp4 VALUES IN(4,6)));
`obclient> CREATE UNIQUE INDEX tbl2_f_rl_idx1 ON tbl2_f_rl(col1,col2) LOCAL;`
在这个案例中,创建的是一个局部前缀唯一索引,同时也可以创建局部前缀非唯一索引
obclient> CREATE INDEX tbl2_f_rl_idx1 ON tbl2_f_rl(col1,col2) LOCAL;
那么,既然满足创建局部前缀唯一索引,那么如果用户创建的是一个局部前缀非唯一索引,功能和使用上有什么差异?它的意义是什么?
2 个赞
论坛小助手
#3
局部前缀唯一索引和局部前缀非唯一索引的主要区别在于索引的唯一性和查询性能。在您的例子中,表 tbl2_f_rl 按照 col1 进行分区,子分区按照 col2 进行列表分区。
局部前缀唯一索引
-
唯一性:确保索引列(这里是
col1, col2)的组合在整个表中是唯一的。这意味着在同一个分区和不同分区中,col1 和 col2 的组合都不能重复。
-
查询性能:由于索引列组合唯一,查询时可以快速定位到特定的记录,提高查询效率。
-
适用场景:适用于需要确保数据唯一性的场景,例如主键或其他唯一约束。
局部前缀非唯一索引
-
唯一性:允许索引列(这里是
col1, col2)的组合在表中重复。这意味着同一个分区和不同分区中,col1 和 col2 的组合可以重复。
-
查询性能:虽然查询性能不如唯一索引高效,但仍然可以通过索引快速缩小查询范围,提高查询效率。
-
适用场景:适用于不需要确保数据唯一性的场景,例如常用的查询条件但不要求唯一性。
意义
-
局部前缀唯一索引:主要用于确保数据的唯一性,防止数据冗余,适用于需要严格控制数据完整性的场景。
-
局部前缀非唯一索引:主要用于提高查询性能,虽然不保证唯一性,但在很多查询场景中仍然非常有用,特别是在数据量较大时,可以显著提高查询速度。
总结来说,选择局部前缀唯一索引还是非唯一索引取决于具体的业务需求。如果需要确保数据的唯一性,应选择唯一索引;如果只是希望提高查询性能而不必关心唯一性,可以选择非唯一索引。
详情请参考:
- 分区索引
- 使用 MySQL 租户做常见数据库开发
- 局部索引
3 个赞