15. ClustrixDB 管理数据分布

本节使用的关键术语:

Relation — ClustrixDB中的每个表都被称为“关系”。

Representation — 在ClustrixDB中,每个索引都称为一个“Representation”。表数据存储在“Base Representation”中,这种关系表示由一个覆盖基本表所有列的内部键索引。对于由主键键控的表,“Base Representation”的数据用主键存储。

Distribution Key — 每个Representation都使用一致的哈希算法对其全部或部分索引进行哈希。“分布键”定义索引的哪些列用于构造散列。索引的默认分布是1,这意味着表示(索引)的第一列将被散列化,并成为该Representation的分布键。

Slices — ClustrixDB将每个Representation分解为更小、更易于管理的称为“slices”的段。然后将片分布在整个集群中,以促进均匀分布的查询处理。

Replicas — ClustrixDB维护每个数据片的多个副本,以提供容错和高可用性。副本分布在整个集群中,以优化性能并确保在节点发生故障时保护所有数据。

DISTRIBUTE

ClustrixDB使用散列来确定给定的数据行或表的索引(Representation)应该位于集群中的何处。用于哈希的列被称为该表示的“分布键”。每个索引都需要关于哪些列应该包含分布键的指导。

默认情况下,分布键使用索引的第一列,而不管索引由多少列组成。这适用于包括主键在内的所有索引。

可以使用DISTRIBUTE = 子句覆盖单个列的默认值,并定义要散列的索引。

  • 使用默认分配
  1.  展开分布键以包含索引的更多列
  2.  展开分布键以包含主键的列
  • 修改分布
  1. 修改分布-主键
  2. 修改分布-备用键

使用默认分配

在本例中,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 ]] 

非主键的最大分布值是备用键和主键的列数的组合。

猜你喜欢

转载自www.cnblogs.com/yuxiaohao/p/11972058.html