欢迎来到阿里云授权服务中心典名科技有限公司!咨询电话:023-66887777 18623333330

微信
手机版
网站地图

PostgreSQL表分区的三种方式

2021-08-11 11:14:06 投稿人 : admin 围观 : 503 次 0 评论

  1 简介

  表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。PostgreSQL的表分区有三种方式:

  Range:范围分区;

  List:列表分区;

  Hash:哈希分区。

  本文通过示例讲解如何进行这三种方式的分区。

  2 例讲三种方式

  为方便,我们通过Docker的方式启动一个PostgreSQL,可参考:《Docker启动PostgreSQL并推荐几款连接工具》。我们要选择较高的版本,否则不支持Hash分区,命令如下:

  docker run -itd \

  --name pkslow-postgres \

  -e POSTGRES_DB=pkslow \

  -e POSTGRES_USER=pkslow \

  -e POSTGRES_PASSWORD=pkslow \

  -p 5432:5432 \

  postgres:13

  2.1 Range范围分区

  先创建一张表带有年龄,然后我们根据年龄分段来进行分区,创建表语句如下:

  CREATE TABLE pkslow_person_r (

  age int not null,

  city varchar not null

  ) PARTITION BY RANGE (age);

  这个语句已经指定了按age字段来分区了,接着创建分区表:

  create table pkslow_person_r1 partition of pkslow_person_r for values from (MINVALUE) to (10);

  create table pkslow_person_r2 partition of pkslow_person_r for values from (11) to (20);

  create table pkslow_person_r3 partition of pkslow_person_r for values from (21) to (30);

  create table pkslow_person_r4 partition of pkslow_person_r for values from (31) to (MAXVALUE);

  这里创建了四张分区表,分别对应年龄是0到10岁、11到20岁、21到30岁、30岁以上。

  接着我们插入一些数据:

  insert into pkslow_person_r(age, city) VALUES (1, 'GZ');

  insert into pkslow_person_r(age, city) VALUES (2, 'SZ');

  insert into pkslow_person_r(age, city) VALUES (21, 'SZ');

  insert into pkslow_person_r(age, city) VALUES (13, 'BJ');

  insert into pkslow_person_r(age, city) VALUES (43, 'SH');

  insert into pkslow_person_r(age, city) VALUES (28, 'HK');

  可以看到这里的表名还是pkslow_person_r,而不是具体的分区表,说明对于客户端是无感知的。

image.png

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

image.png

  而且分区表与主表的字段是一致的。

  查询分区表,就只能查到那个特定分区的数据了:

image.png

  2.2 List列表分区

  类似的,列表分区是按特定的值来分区,比较某个城市的数据放在一个分区里。这里不再给出每一步的讲解,代码如下:

  -- 创建主表

  create table pkslow_person_l (

  age int not null,

  city varchar not null

  ) partition by list (city);

  -- 创建分区表

  CREATE TABLE pkslow_person_l1 PARTITION OF pkslow_person_l FOR VALUES IN ('GZ');

  CREATE TABLE pkslow_person_l2 PARTITION OF pkslow_person_l FOR VALUES IN ('BJ');

  CREATE TABLE pkslow_person_l3 PARTITION OF pkslow_person_l DEFAULT;

  -- 插入测试数据

  insert into pkslow_person_l(age, city) VALUES (1, 'GZ');

  insert into pkslow_person_l(age, city) VALUES (2, 'SZ');

  insert into pkslow_person_l(age, city) VALUES (21, 'SZ');

  insert into pkslow_person_l(age, city) VALUES (13, 'BJ');

  insert into pkslow_person_l(age, city) VALUES (43, 'SH');

  insert into pkslow_person_l(age, city) VALUES (28, 'HK');

  insert into pkslow_person_l(age, city) VALUES (28, 'GZ');

  当我们查询第一个分区的时候:

image.png

  2.3 Hash哈希分区

  哈希分区是指按字段取哈希值后再分区。具体的语句如下:

  -- 创建主表

  create table pkslow_person_h (

  age int not null,

  city varchar not null

  ) partition by hash (city);

  -- 创建分区表

  create table pkslow_person_h1 partition of pkslow_person_h for values with (modulus 4, remainder 0);

  create table pkslow_person_h2 partition of pkslow_person_h for values with (modulus 4, remainder 1);

  create table pkslow_person_h3 partition of pkslow_person_h for values with (modulus 4, remainder 2);

  create table pkslow_person_h4 partition of pkslow_person_h for values with (modulus 4, remainder 3);

  -- 插入测试数据

  insert into pkslow_person_h(age, city) VALUES (1, 'GZ');

  insert into pkslow_person_h(age, city) VALUES (2, 'SZ');

  insert into pkslow_person_h(age, city) VALUES (21, 'SZ');

  insert into pkslow_person_h(age, city) VALUES (13, 'BJ');

  insert into pkslow_person_h(age, city) VALUES (43, 'SH');

  insert into pkslow_person_h(age, city) VALUES (28, 'HK');

  可以看到创建分区表的时候,我们用了取模的方式,所以如果要创建N个分区表,就要取N取模。

  随便查询一张分区表如下:

image.png


版权声明:本站部分文章内容、图片来源于网友推荐、互联网收集整理而来,仅供大家学习参考,不代表本站立场,如有侵权,请联系站长,我们会第一时间处理!本站原创内容未经允许不得转载,或转载时需注明出处:典名科技资讯门户

相关文章

  • mysql5.7如何修改root密码
    mysql5.7如何修改root密码

    这篇文章主要介绍了mysql5.7如何修改root密码的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql5.7如何修改root密码文章都会有所收获,下面我们一起来看看吧。方法:1、用“set passwo...

    2022-05-23 13:47:02
  • mysql如何修改column
    mysql如何修改column

    这篇文章主要介绍“mysql如何修改column”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql如何修改column”文章能帮助大家解决问题。方法:1、用“alter table 表名 mo...

    2022-05-23 13:47:01
  • mysql的慢查询日志记录哪些内容
    mysql的慢查询日志记录哪些内容

    本篇内容主要讲解“mysql的慢查询日志记录哪些内容”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql的慢查询日志记录哪些内容”吧!在mysql中,慢查询日志记录的是响应时间超过阈值的语句...

    2022-05-23 13:47:01
  • 常见SQL注入类型及原理是什么
    常见SQL注入类型及原理是什么

    这篇“常见SQL注入类型及原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“常见SQL注入类型及原理是什么”文章吧。M...

    2022-05-23 13:47:01
  • mysql workbench中如何注释
    mysql workbench中如何注释

    本篇内容介绍了“mysql workbench中如何注释”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!mysql workbench中的注释...

    2022-05-23 13:46:58
  • mysql如何修改definer
    mysql如何修改definer

    这篇文章主要介绍“mysql如何修改definer”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql如何修改definer”文章能帮助大家解决问题。修改方法:1、利用“update mysql...

    2022-05-23 13:46:56
  • mysql如何查询当前登录的用户
    mysql如何查询当前登录的用户

    本文小编为大家详细介绍“mysql如何查询当前登录的用户”,内容详细,步骤清晰,细节处理妥当,希望这篇“mysql如何查询当前登录的用户”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。方法:1、用USER()函数,...

    2022-05-18 10:01:01
  • mysql如何查询外键约束
    mysql如何查询外键约束

    这篇文章主要介绍了mysql如何查询外键约束的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql如何查询外键约束文章都会有所收获,下面我们一起来看看吧。在mysql中,可以利用show语句查询外键约束,sh...

    2022-05-18 10:01:01
  • mysql查询如何设置降序
    mysql查询如何设置降序

    本篇内容介绍了“mysql查询如何设置降序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在mysql中,可以利用desc关键字对查询结果进行...

    2022-05-18 10:01:00
  • mysql如何修改主键的值
    mysql如何修改主键的值

             这篇文章主要介绍了mysql如何修改主键的值的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mysql如何修改主键的值文章都会有所收获,下面我们...

    2022-05-18 10:01:00
发表评论