在GBase 8c数据库分布式场景下,主键、外键和索引的创建与分布列(distribution column)紧密相关。
1、主键与分布列
分布列是用于决定在分布式系统中数据如何分布的列。主键通常用于确保数据的唯一性,并且在分布式数据库中,主键的选择对数据分布有重要影响。
在GBase分布式数据库中,创建表时可以指定分布列,主键通常包含分布列。
创建表时指定分布列和主键的语法:
CREATE TABLE table_name (
column1 datatype [NOT NULL],
column2 datatype,
PRIMARY KEY (column1, column2)
) DISTRIBUTE BY HASH (column1);
在这个例子中,column1是分布列,也是主键的一部分。数据将根据column1的值进行哈希分布(HASH)。
2、外键与分布列
在分布式数据库中,外键约束通常也需要考虑分布列,以确保数据的一致性和完整性。外键列应该与父表的分布列对齐,以避免跨节点的外键约束检查。
创建外键时考虑分布列的语法:
CREATE TABLE child_table (
column1 datatype,
column2 datatype,
FOREIGN KEY (column1) REFERENCES parent_table(column1)
) DISTRIBUTE BY HASH (column1);
在这个例子中,表child_table的列column1是外键,引用了表parent_table的列column1。两个表都以column1作为分布列,确保了外键约束的有效性。
3、索引与分布列
索引在分布式数据库中也与分布列有关。通常,索引应该包含分布列,以优化查询性能和数据访问模式。
创建索引时包含分布列的语法:
CREATE INDEX index_name ON table_name (column1, column2);
根据前面示例,column1是分布列,column2是另一个列。创建索引时包含分布列可以帮助优化查询,特别是在执行连接操作时。
使用建议:
- 选择分布列:分布列的选择应该基于数据访问模式和查询需求。通常,分布列应该是查询中经常使用的列,如JOIN操作中的列。
- 避免数据倾斜:确保分布列的选择能够均匀分布数据,避免某些节点上的数据过多,导致数据倾斜。
- 维护索引:在分布式环境中,索引的维护可能更加复杂。确保索引的选择和维护能够支持高效的数据访问和查询性能。
- 考虑数据一致性:在外键约束中,确保子表和父表的分布列对齐,以维护数据的一致性和完整性。
通过合理设计和使用分布列,可以显著提高GBase分布式数据库的性能和可扩展性。
4、组合索引
在分布式数据库中,创建组合索引时,对于HASH分布表,主键和唯一索引必须包含分布键。这意味着,如果你的表是HASH分布的,那么在创建组合索引时,必须包含分布列作为索引的一部分。这样做可以确保数据在分布式系统中正确分布,同时提高查询效率。
合理设计组合索引,避免冗余。例如已对(a,b,c)创建索引,则不应再单独对(a)、(b)、(c)、(a,b)、(b,c)创建索引。
当查询时如果只带有a字段上的过滤条件,一般也会利用组合索引进行查询。
对于分区表创建索引时,需要注意:
- 在使用LOCAL索引创建唯一索引时,索引项中必须包含分布列和所有分区键。GLOBAL索引无此约束。
- 分区表创建GLOBAL索引时,存在以下约束条件:
- 不支持表达式索引、部分索引
- 不支持列存表
- 仅支持B-tree索引
此外,全局二级索引(Global Secondary Index,简称GSI)允许用户定义与基表分布不一致的索引,从而实现非基表分布键点查/点查和范围查询性能提升,去除UNIQUE/PRIMARY KEY需包含基表分布键的约束。