本节使用的关键术语:
Relation — ClustrixDB中的每个表都被称为“关系”。
Representation — 在ClustrixDB中,每个索引都称为一个“Representation”。表数据存储在“Base Representation”中,这种关系表示由一个覆盖基本表所有列的内部键索引。对于由主键键控的表,“Base Representation”的数据用主键存储。
Distribution Key — 每个Representation都使用一致的哈希算法对其全部或部分索引进行哈希。“分布键”定义索引的哪些列用于构造散列。索引的默认分布是1,这意味着表示(索引)的第一列将被散列化,并成为该Representation的分布键。
Slices — ClustrixDB将每个Representation分解为更小、更易于管理的称为“slices”的段。然后将片分布在整个集群中,以促进均匀分布的查询处理。
Replicas — ClustrixDB维护每个数据片的多个副本,以提供容错和高可用性。副本分布在整个集群中,以优化性能并确保在节点发生故障时保护所有数据。
DISTRIBUTE
ClustrixDB使用散列来确定给定的数据行或表的索引(Representation)应该位于集群中的何处。用于哈希的列被称为该表示的“分布键”。每个索引都需要关于哪些列应该包含分布键的指导。
默认情况下,分布键使用索引的第一列,而不管索引由多少列组成。这适用于包括主键在内的所有索引。
可以使用DISTRIBUTE = 子句覆盖单个列的默认值,并定义要散列的索引。
- 使用默认分配
- 展开分布键以包含索引的更多列
- 展开分布键以包含主键的列
- 修改分布
- 修改分布-主键
- 修改分布-备用键
使用默认分配
在本例中,post_id的主键被散列,表的数据使用该值进行分布,默认的分布设置为DISTRIBUTE = 1。
sql> CREATE TABLE user_posts ( post_id int AUTO_INCREMENT, user_id int, posted_on timestamp, data blob, PRIMARY KEY (`post_id`) /*$ DISTRIBUTE=1 */, KEY `user_id_posted_on_idx` (`user_id`,`posted_on`) /*$ DISTRIBUTE=1 */ );
在某些情况下,基于单个列的数据和索引分布可能导致较差或“块状”分布。为了解决这个问题,我们建议将最独特的(选择性的)列放到composite index的第一列中,或者将分布键从单个列扩展到多个列。有两种方法可以做到这一点。
1. 展开分布键以包含索引的更多列
下面的示例显示了多列备用键user_id_posted_on_idx,它使用索引中的两个列而不是第一个列进行分布。
sql> CREATE TABLE user_posts ( post_id int AUTO_INCREMENT, user_id int, posted_on timestamp, data blob, PRIMARY KEY (`post_id`) /*$ DISTRIBUTE=1 */, KEY `user_id_posted_on_idx` (`user_id`,`posted_on`) /*$ DISTRIBUTE=2 */ );
2. 展开分布键以包含主键的列
下面的示例显示了另一个密钥user_id_posted_on_idx,它的分布为3。这意味着索引将分布在它的两个列(user_id、posted_on)和主键(post_id)上。如果主键是复合键,则可以进一步扩展分布,以包含主键的其他列。
sql> CREATE TABLE user_posts ( post_id int AUTO_INCREMENT, user_id int, posted_on timestamp, data blob, PRIMARY KEY (`post_id`) /*$ DISTRIBUTE=1 */, KEY `user_id_posted_on_idx` (`user_id`,`posted_on`) /*$ DISTRIBUTE=3 */ );
修改分布
修改分布-主键
要在创建表之后修改组合主键的分布,请遵循以下ALTER table语法:
ALTER TABLE tbl_name PRIMARY KEY [DISTRIBUTE = n]
主键的分布计数不能超过主键中的列数。
修改分布-备用键
要在创建表之后修改其他索引(非主键)的分布,请按照以下语法在ALTER表中指定index_name:
ALTER TABLE tbl_name [ ,INDEX index_name [DISTRIBUTE = n]] [ ,INDEX index_name [DISTRIBUTE = n ]]
非主键的最大分布值是备用键和主键的列数的组合。