• 售前

  • 售后

热门帖子
入门百科

浅谈PostgreSQL表分区的三种方式

[复制链接]
jimmy肖明 显示全部楼层 发表于 2021-8-14 15:25:11 |阅读模式 打印 上一主题 下一主题
目次


  • 一、简介
  • 二、三种方式

    • 2.1、Range范围分区
    • 2.2、List列表分区
    • 2.3、Hash哈希分区

  • 三、总结

一、简介

表分区是解决一些因单表过大引用的性能标题的方式,比如某张表过大就会造成查询变慢,大概分区是一种解决方案。一般发起当单表大小凌驾内存就可以考虑表分区了。PostgreSQL的表分区有三种方式:
       
  • Range:范围分区;   
  • List:列表分区;   
  • Hash:哈希分区。
本文通过示例讲解怎样举行这三种方式的分区。

二、三种方式

为方便,我们通过Docker的方式启动一个PostgreSQL。我们要选择较高的版本,否则不支持Hash分区,下令如下:
  1. <span style="background-color: initial;">docker run -itd \</span>
  2.     --name pkslow-postgres \
  3.     -e POSTGRES_DB=pkslow \
  4.     -e POSTGRES_USER=pkslow \
  5.     -e POSTGRES_PASSWORD=pkslow \
  6.     -p 5432:5432 \
  7.     postgres:13
复制代码
2.1、Range范围分区

先创建一张表带有年岁,然后我们根据年岁分段来举行分区,创建表语句如下:
  1. CREATE TABLE pkslow_person_r (
  2.     age int not null,
  3.     city varchar not null
  4. ) PARTITION BY RANGE (age);
复制代码
这个语句已经指定了按age字段来分区了,接着创建分区表:
  1. create table pkslow_person_r1 partition of pkslow_person_r for values from (MINVALUE) to (10);
  2. create table pkslow_person_r2 partition of pkslow_person_r for values from (11) to (20);
  3. create table pkslow_person_r3 partition of pkslow_person_r for values from (21) to (30);
  4. create table pkslow_person_r4 partition of pkslow_person_r for values from (31) to (MAXVALUE);
复制代码
这里创建了四张分区表,分别对应年岁是0到10岁、11到20岁、21到30岁、30岁以上。
接着我们插入一些数据:
  1. insert into pkslow_person_r(age, city) VALUES (1, 'GZ');
  2. insert into pkslow_person_r(age, city) VALUES (2, 'SZ');
  3. insert into pkslow_person_r(age, city) VALUES (21, 'SZ');
  4. insert into pkslow_person_r(age, city) VALUES (13, 'BJ');
  5. insert into pkslow_person_r(age, city) VALUES (43, 'SH');
  6. insert into pkslow_person_r(age, city) VALUES (28, 'HK');
复制代码
可以看到这里的表名还是
  1. pkslow_person_r
复制代码
,而不是具体的分区表,阐明对于客户端是无感知的。
我们查询也一样的:

但现实上是有分区表存在的:

而且分区表与主表的字段是划一的。
查询分区表,就只能查到谁人特定分区的数据了:


2.2、List列表分区

雷同的,列表分区是按特定的值来分区,比较某个城市的数据放在一个分区里。这里不再给出每一步的讲解,代码如下:
  1. -- 创建主表
  2. create table pkslow_person_l (
  3.                           age int not null,
  4.                           city varchar not null
  5. ) partition by list (city);
  6. -- 创建分区表
  7. CREATE TABLE pkslow_person_l1 PARTITION OF pkslow_person_l FOR VALUES IN ('GZ');
  8. CREATE TABLE pkslow_person_l2 PARTITION OF pkslow_person_l FOR VALUES IN ('BJ');
  9. CREATE TABLE pkslow_person_l3 PARTITION OF pkslow_person_l DEFAULT;
  10. -- 插入测试数据
  11. insert into pkslow_person_l(age, city) VALUES (1, 'GZ');
  12. insert into pkslow_person_l(age, city) VALUES (2, 'SZ');
  13. insert into pkslow_person_l(age, city) VALUES (21, 'SZ');
  14. insert into pkslow_person_l(age, city) VALUES (13, 'BJ');
  15. insert into pkslow_person_l(age, city) VALUES (43, 'SH');
  16. insert into pkslow_person_l(age, city) VALUES (28, 'HK');
  17. insert into pkslow_person_l(age, city) VALUES (28, 'GZ');
复制代码
当我们查询第一个分区的时间,只有广州的数据:


2.3、Hash哈希分区

哈希分区是指按字段取哈希值后再分区。具体的语句如下:
  1. -- 创建主表
  2. create table pkslow_person_h (
  3.                           age int not null,
  4.                           city varchar not null
  5. ) partition by hash (city);
  6. -- 创建分区表
  7. create table pkslow_person_h1 partition of pkslow_person_h for values with (modulus 4, remainder 0);
  8. create table pkslow_person_h2 partition of pkslow_person_h for values with (modulus 4, remainder 1);
  9. create table pkslow_person_h3 partition of pkslow_person_h for values with (modulus 4, remainder 2);
  10. create table pkslow_person_h4 partition of pkslow_person_h for values with (modulus 4, remainder 3);
  11. -- 插入测试数据
  12. insert into pkslow_person_h(age, city) VALUES (1, 'GZ');
  13. insert into pkslow_person_h(age, city) VALUES (2, 'SZ');
  14. insert into pkslow_person_h(age, city) VALUES (21, 'SZ');
  15. insert into pkslow_person_h(age, city) VALUES (13, 'BJ');
  16. insert into pkslow_person_h(age, city) VALUES (43, 'SH');
  17. insert into pkslow_person_h(age, city) VALUES (28, 'HK');
复制代码
可以看到创建分区表的时间,我们用了取模的方式,以是如果要创建N个分区表,就要取N取模。
随便查询一张分区表如下:

可以看到同是SZ的哈希值是一样的,肯定会分在同一个分区,而BJ的哈希值取模后也属于同一个分区。

三、总结

本文讲解了PostgreSQL分区的三种方式。
代码请查察:https://github.com/LarryDpk/pkslow-samples
以上就是浅谈PostgreSQL表分区的三种方式的具体内容,更多关于PostgreSQL表分区的资料请关注脚本之家别的相干文章!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作