postgresql 分表

本贴最后更新于 2053 天前,其中的信息可能已经东海扬尘

一:概述
    在客户数据积累到一定程度后,尤其是单表数据达到千万级别的时候,随着查询速度越来越慢以及数据管理等需求,就要考虑分表,pg 的分表把逻辑上的一个大表分割成物理上的几块,分表后,不仅带来查询速度的提升,数据管理与维护也方便了许多(把逻辑上很大的一块按照某个维度分成了 N 个小块)。
二:分表
    2.1 创建主表
    create table t_student(
     student_id serial8 primary key,
     name varchar(255),
     age int4,
     create_date date
    )
    2.2 创建分区表
    create table t_student_1_1000(check (student_id >=1 and student_id <1000)) inherits(t_student);
    create table t_student_1000_2000(check (student_id >=1000 and student_id <2000)) inherits(t_student);
    create table t_student_2000_3000(check (student_id >=2000 and student_id <3000)) inherits(t_student);
    2.3 创建触发器函数
    create or replace function t_student_insert_trigger()
    returns trigger
    language plpgsql
    as

&nbsp;&nbsp;&nbsp;&nbsp;begin &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(new.student_id >=1 and new.student_id < 1000) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert into t_student_1_1000 values(new.*); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(new.student_id >=1000 and new.student_id < 2000) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert into t_student_1000_2000 values(new.*); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elsif(new.student_id >=2000 and new.student_id < 3000) then &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert into t_student_2000_3000 values(new.*); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise exception 'student_id out of range.Fix the t_student_insert_trigger() function!'; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end if; &nbsp;&nbsp;&nbsp;&nbsp;return null; &nbsp;&nbsp;&nbsp;&nbsp;end; &nbsp;&nbsp;&nbsp;&nbsp;

    2.4 创建触发器
    create trigger insert_t_student_parttion_trigger before insert on t_student for each row execute procedure t_student_insert_trigger();
三:测试
    3.1 插入数据
    insert into t_student (student_id,name,age,create_date) values(1,'zhangsan',21,now());
    insert into t_student (student_id,name,age,create_date) values(2,'lisi',21,now());
    insert into t_student (student_id,name,age,create_date) values(1000,'wangwu',21,now());
    insert into t_student (student_id,name,age,create_date) values(1001,'zhaoliu',21,now());
    insert into t_student (student_id,name,age,create_date) values(2000,'zhaoqi',21,now());
    insert into t_student (student_id,name,age,create_date) values(2001,'wangba`',21,now());
    3.2 查看数据
    3.2.1 查看主表数据
    postgres=# select * from t_student;
    student_id | name | age | create_date
    ------------+----------+-----+-------------
     1 | zhangsan | 21 | 2018-09-11

     2 | lisi | 21 | 2018-09-11

     1000 | wangwu | 21 | 2018-09-11

     1001 | zhaoliu | 21 | 2018-09-11

     2000 | zhaoqi | 21 | 2018-09-11

     2001 | wangba` | 21 | 2018-09-11
    3.2.2 查看分区表数据
    postgres=# select * from t_student_1_1000 ;

    student_id | name | age | create_date

    ------------+----------+-----+-------------

     1 | zhangsan | 21 | 2018-09-11

     2 | lisi | 21 | 2018-09-11

    (2 rows)

    postgres=# select * from t_student_1000_2000 ;

     student_id | name | age | create_date

    ------------+---------+-----+-------------

     1000 | wangwu | 21 | 2018-09-11

     1001 | zhaoliu | 21 | 2018-09-11

    (2 rows)

    postgres=# select * from t_student_2000_3000 ;

     student_id | name | age | create_date

    ------------+---------+-----+-------------

     2000 | zhaoqi | 21 | 2018-09-11

     2001 | wangba` | 21 | 2018-09-11
    3.3 执行
    postgres=# explain select * from t_student where student_id between 1 and 10;

     QUERY PLAN

    -------------------------------------------------------------------------

     Append (cost=0.00..12.10 rows=2 width=532)

     -> Seq Scan on t_student (cost=0.00..0.00 rows=1 width=532)

     Filter: ((student_id >= 1) AND (student_id <= 10))

     -> Seq Scan on t_student_1_1000 (cost=0.00..12.10 rows=1 width=532)

     Filter: ((student_id >= 1) AND (student_id <= 10))

    (5 rows)
四:注意事项
    4.1 主表一定不能有数据,如果在已有数据的表上做分表操作的话,先对原来的表数据进行备份,然后进行表数据删除处理,等分表跟触发器都创建完毕后,再从备份恢复数据,数据就会插入到各自的分区表里
    4.2 一定要注意触发器函数的 range 范围,最好把未来几年的全部创建好,否则插入数据超出范围的话会报 exception,如果插入新的分区表,只需要创建新的分区表跟更新触发器函数即可
    4.3 每个业务的 range 定义字段都有所不同,id 分的话,每个分区表的数据都会比较均匀,也可以按照时间字段等去划分
    4.4 where 查询如果字段包含分区字段的话,会去相关的分区表里去检索数据,如果有其他常用的检索字段的话,请自行在分区表里增加索引字段提高更快速的检索速度
五:参考资料
    pg 官方文档:https://www.postgresql.org/docs/10/static/ddl-partitioning.html

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖
  • 分区表
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 690 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 152 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    215 引用 • 462 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    396 引用 • 3416 回帖
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 3 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 740 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 685 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 589 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 692 关注
  • 反馈

    Communication channel for makers and users.

    123 引用 • 906 回帖 • 192 关注
  • danl
    62 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖 • 1 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 2 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 594 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 20 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • V2Ray
    1 引用 • 15 回帖 • 2 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 27 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 513 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 2 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    19 引用 • 31 回帖 • 1 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 150 关注