问题的提出

在项目中,有些表的记录增长非常快,记录数过大时会使得查询变得困难,导致整个数据库处理性能下降。此时,我们会考虑按一定的规则进行分表存储。

常用的分表方式是按时间周期,如每月一张,每天一张等。当每月或每天首条记录到达时,根据表结构创建该周期为后缀的表进行存储。

相关考虑

这其中主要考虑两个问题:

(1)如何复制表

采用分表机制,通常会建立一个模板表。所谓模板表,是只定义结构不存储数据的,也可称之为类表,而分表,通常会以增加后缀的方式命名,如 log_201901,分表实际存储数据,可称之为实例表。

表存在关联、键、索引、约束等,这让表的复制听起来比较繁琐,即便通过元数据得到这些信息,还需要自己考虑如索引的命名冲突等问题。而 PostgreSQL 为我们提供了极其便捷的方式。

CREATE TABLE [IF NOT EXISTS] 实例表 (LIKE 模板表 [INCLUDING ALL]);

其中 [ ] 内表示可选项,INCLUDING 除了 ALL 还要其它细分的选项,具体可参考帮助文档。

(2)数据存储的逻辑过程

首先得知道表存不存在,不存在则要创建,然后执行数据操作语句。

由于表名是动态的,在应用系统中可以先取得表名形成 SQL 语句再执行,在数据库存储过程中则可以使用 EXECUTE 执行动态SQL语句。

分表实例

下边,本文以日志记录表为例来完整地实践分表处理过程。

功能描述:日志数量大,当前日志查询频繁,历史日志需要全部保存。要求每天一个分表,日志主键要求全局保持唯一性(即多个分表间不重复),日志到达自动根据当前的时间进行分表存储。

首先创建日志模板表,命名为 log_template,并为其建立相关索引,主键序列。

-- 创建模板表,log_id 主键,log_at 日志时间, log_content 日志内容
CREATE TABLE log_template (log_id bigint PRIMARY KEY, log_at timestamp, log_content varchar(1000));
-- 对日志时间索引
CREATE INDEX idx_log_at on log_template (log_at);
-- 用于主键的序列(各分表使用同一序列)
CREATE SEQUENCE seq_log_id;

我们通过一个过程来完成日志的自动分表存储。

CREATE OR REPLACE FUNCTION func_log(v_conent varchar) RETURNS bool LANGUAGE 'plpgsql'
AS $$
DECLARElv_log_at timestamp := current_timestamp;lv_suffix_tname varchar; -- 带后缀的分表名lv_dsql text;            -- 动态SQL
BEGIN-- 根据时间得到应使用的分表名称lv_suffix_tname := 'log_' || to_char(lv_log_at, 'YYYYMMDD');-- 判断是否存在,不存在时复制模板创建分表lv_dsql := 'CREATE TABLE IF NOT EXISTS ' || lv_suffix_tname || ' (LIKE log_template INCLUDING ALL)';EXECUTE lv_dsql;  -- 将数据保存至分表lv_dsql := 'INSERT INTO ' || lv_suffix_tname || '(log_id, log_at, log_content) VALUES($1, $2, $3)';EXECUTE lv_dsql USING nextval('seq_log_id'), lv_log_at, v_conent;RETURN true;
END $$;

执行以下语句来看看预期的结果。

SELECT func_log('hello, the first log!');
SELECT func_log('toady is a nice day!');
SELECT func_log('每天都有新的开始,不再担心爆表!');

结束语

分表能够避免单表记录过于庞大,提高查询性能。但同时,分表也会给部分查询或数据处理带有复杂性,因此是否分表应该根据业务需要来,同时应尽早规划,后期更改相对繁琐。

在 MySQL 中也有类似的 CREATE TABLE LIKE 语法,我想都是应运而生,简单就是美。

转载于:https://www.cnblogs.com/timeddd/p/10874007.html

PostgreSQL 务实应用(三/5)分表复制相关推荐

  1. postgresql 先创建唯一主键 再分区_PostgreSQL 务实应用(三/5)分表复制

    问题的提出 在项目中,有些表的记录增长非常快,记录数过大时会使得查询变得困难,导致整个数据库处理性能下降.此时,我们会考虑按一定的规则进行分表存储. 常用的分表方式是按时间周期,如每月一张,每天一张等 ...

  2. PostgreSQL 动态表复制(CREATE TABLE ASCREATE TABLE LIKE)

    前言 项目中有表复制的需求,而且是动态复制,即在存储过程里根据参数数组的值循环复制n张结构(约束.索引等)等一致的一组表,PostgreSQL提供了两种语法来进行表复制,分别是:CREATE TABL ...

  3. 【MySQL性能优化】MySQL分库分表与水平分割取模案例(三)

    转载自 http://chenhaoxiang.cn/2018/02/05/2316/ 分表分库 当项目比较大的时候,基本上都会进行分表分库的 后面就讲讲什么时候需要分库,什么时候需要分表 什么时候需 ...

  4. MySQL分库分表和优化

    第九阶段模块三 分库分表技术之MyCat 1.海量存储问题 1.1 背景描述 随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无 ...

  5. mysql如何根据业务分表设计_mysql分表分库的应用场景和设计方式

    很多朋友在论坛和留言区域问mysql在什么情况下才需要进行分库分表,以及采用何种设计方式才是最优的选择,根据这些问题,小编为大家整理了关于MySQL分库分表的应用场景和最优的设计方式举例. 一. 分表 ...

  6. 银行背景下分库分表技术选型

    业务持续增长带来的单表数据量过大,必然影响到数据库的读写性能,那到底要不要分库分表呢? 阿里巴巴P3C规范给出一个推荐: [推荐]单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表. 说 ...

  7. 浅谈分库分表那些事儿

    简介:本文主要阐述在分库分表改造过程中需要考虑的因素以及对应的解法,还有踩过的那些坑. 本文适合阅读群众:需要从单库单表改造为多库多表的新手. 本文主要阐述在分库分表改造过程中需要考虑的因素以及对应的 ...

  8. 分表分库时机选择及策略

    转载自   分表分库时机选择及策略 一. 分表 应用场景: 对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问.采用Master-Slave复制模式 ...

  9. 阿里技术:浅谈分库分表那些事儿

    本文主要阐述在分库分表改造过程中需要考虑的因素以及对应的解法,还有踩过的那些坑. 一  前言 我们既然要做分库分表,那总要有个做事的动机.那么,在动手之前,首先就要弄明白下面两个问题. 1  什么是分 ...

最新文章

  1. jquery 中attr和prop的区别
  2. python写服务器端qt客户端_python写一些简单的tcp服务器和客户端
  3. field module的on input和on request区别
  4. Android Studio——[Missing essential plugin: org.jetbrains.android ...]解决方案
  5. xcode的bundle identifier修改
  6. RMAN 目录管理维护
  7. lorenz系统simulink仿真_simulink控制系统仿真之控制系统的分析方法(2)(频域分析法)...
  8. c语言五位数大到小排序,刚学c语言,老师让用if编一个五个数字从大到小的排序,有那个大神能帮我,谢谢啦...
  9. aiohttp保存MySQL_python链家网高并发异步爬虫asyncio+aiohttp+aiomysql异步存入数据
  10. UltraEdit搭建python IDE环境+设置快捷键
  11. 【C#语言学习】学习一门语言
  12. Unity编辑器扩展工具Shader Forge和Behavior Designer(行为树)和 Cinema Director
  13. 用Python多线程抓取并验证代理(转)
  14. 倒不过的“饮食时差”,减肥路上的最大阻碍?
  15. React.js基础知识总结一
  16. 蜘蛛侠面具(头套制作)
  17. 每日一算法:冒泡排序
  18. selenium学习——问卷星(可控比例)
  19. 【RTT】I2C总线设备:分析
  20. 石家庄市中考计算机试题,河北中考信息技术Word考题.docx

热门文章

  1. 实用ExtJS教程100例-004:等待对话框Ext.MessageBox.wait
  2. vmbox下linux共享文件
  3. 如何使用 Redis 实现大规模的帖子浏览计数
  4. Spring的OncePerRequestFilter的作用
  5. 10张图带你深入理解Docker容器和镜像
  6. svn: Checksum mismatch while updating 'D:\workspace\demo\test\.svn\text-base\test.php.svn-base'
  7. AutoBench+Httperf的安装、测试
  8. UNIX:描述符和文件结构
  9. 网络:TCP粘包问题?如何解决?
  10. 操作系统:用户态和核心态的区别