常见数据分布方式
现代分布式数据库中,常见的数据分布方式有如下几种:
Round-Robin:以轮询的方式把数据逐个放置在相邻节点上。
Range:按区间进行数据分布。
List:直接基于离散的各个取值做数据分布,性别、省份等数据就满足这种离散的特性。每个离散值会映射到一个节点上,多个不同的取值可能也会映射到相同节点上。
Hash:通过哈希函数把数据映射到不同节点上。
为了更灵活地划分数据,除了单独采用上述数据分布方式之一以外,您还可以根据具体的业务场景需求组合使用这些数据分布方式。常见的组合方式有 Hash+Hash、Range+Hash、Hash+List。更多信息请查看文档 数据分布。
Random 分布
建表时不设置分区和分桶方式,则默认使用 Random 分布。
CREATE TABLE site_access1 (event_day DATE,site_id INT DEFAULT 10,pv BIGINT DEFAULT 0 ,city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT '')DUPLICATE KEY (event_day,site_id,pv);-- 没有设置任何分区和分桶方式,默认为 Random 分布(目前仅支持明细表)
Hash 分布
CREATE TABLE site_access2 (event_day DATE,site_id INT DEFAULT 10,city_code SMALLINT,user_name VARCHAR(32) DEFAULT '',pv BIGINT SUM DEFAULT 0)AGGREGATE KEY (event_day, site_id, city_code, user_name)-- 设置分桶方式为哈希分桶,并且必须指定分桶键DISTRIBUTED BY HASH(event_day,site_id);
Range + Random 分布
CREATE TABLE site_access3 (event_day DATE,site_id INT DEFAULT 10,pv BIGINT DEFAULT 0 ,city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT '')DUPLICATE KEY(event_day,site_id,pv)-- 设为分区方式为表达式分区,并且使用时间函数的分区表达式(当然您也可以设置分区方式为 Range 分区)PARTITION BY date_trunc('day', event_day);-- 没有设置分桶方式,默认为随机分桶(目前仅支持明细表)
Range + Hash 分布
CREATE TABLE site_access4 (event_day DATE,site_id INT DEFAULT 10,city_code VARCHAR(100),user_name VARCHAR(32) DEFAULT '',pv BIGINT SUM DEFAULT 0)AGGREGATE KEY(event_day, site_id, city_code, user_name)-- 设为分区方式为表达式分区,并且使用时间函数的分区表达式(当然您也可以设置分区方式为 Range 分区)PARTITION BY date_trunc('day', event_day)-- 设置分桶方式为哈希分桶,必须指定分桶键DISTRIBUTED BY HASH(event_day, site_id);
List + Random 分布
CREATE TABLE t_recharge_detail1 (id bigint,user_id bigint,recharge_money decimal(32,2),city varchar(20) not null,dt date not null)DUPLICATE KEY(id)-- 设为分区方式为表达式分区,并且使用列分区表达式(当然您也可以设置分区方式为 List 分区)PARTITION BY (city);-- 没有设置分桶方式,默认为随机分桶(目前仅支持明细表)
List + Hash 分布
CREATE TABLE t_recharge_detail2 (id bigint,user_id bigint,recharge_money decimal(32,2),city varchar(20) not null,dt date not null)DUPLICATE KEY(id)-- 设为分区方式为表达式分区,并且使用列分区表达式(当然您也可以设置分区方式为 List 分区)PARTITION BY (city)-- 设置分桶方式为哈希分桶,并且必须指定分桶键DISTRIBUTED BY HASH(city,id);