问题的提出

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

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

相关考虑

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

(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 $$
DECLARE
lv_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 语法,我想都是应运而生,简单就是美。

PostgreSQL 务实应用(三/5)分表复制的更多相关文章

  1. Mysql性能优化三(分表、增量备份、还原)

    接上篇Mysql性能优化二 对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻 ...

  2. elasticsearch系列(三)分表分库

    首先ES没有库和表的概念,只有index,type,document(详细术语可以看ES的系列一 http://www.cnblogs.com/ulysses-you/p/6736926.html), ...

  3. mysql 分表与分区

    一.操作环境 数据达到百w甚于更多的时候,我们的mysql查询将会变得比较慢, 如果再加上连表查询,程序可能会卡死.即使你设置了索引并在查询中使用到了索引,查询还是会慢.这时候你就要考虑怎么样来提高查 ...

  4. MySQL分表

    一.概念 1.为什么要分表和分区?日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询 ...

  5. MySQL分区和分表

    一.概念 1.为什么要分表和分区?日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询 ...

  6. MySql从一窍不通到入门(五)Sharding:分表、分库、分片和分区

    转载:用sharding技术来扩展你的数据库(一)sharding 介绍 转载:MySQL架构方案 - Scale Out & Scale Up. 转载: 数据表分区策略及实现(一) 转载:M ...

  7. MySql分库分表与分区的区别和思考

    一.分分合合 说过很多次,不要拘泥于某一个技术的一点,技术是相通的.重要的是编程思想,思想是最重要的.当数据量大的时候,需要具有分的思想去细化粒度.当数据量太碎片的时候,需要具有合的思想来粗化粒度. ...

  8. mysql分表的三种方法

    先说一下为什么要分表当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间.根据个人经验,mysql执行一 ...

  9. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

    读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作. 目前有多种方式实现读写分离,一种 ...

随机推荐

  1. smartUpload注意过程

    操作的过程中一定要注意的几个方面:       1.将smartUpload.jar拷贝到tomcat/lib以及项目的lib下面,最好是只多不少!       2.因为上传的文件一般都很大,所以应该 ...

  2. 【LeetCode with Python】 Sort List

    博客域名:http://www.xnerv.wang 原题页面:https://oj.leetcode.com/problems/sort-list/ 题目类型: 难度评价:★ 本文地址:http:/ ...

  3. jQuery功能强大的图片查看器插件

    简要教程 viewer是一款功能强大的图片查看器jQuery插件.它可以实现ACDsee等看图软件的部分功能.它可以对图片进行移动,缩放,旋转,翻转,可以前后浏览一组图片.该图片查看器还支持移动设备, ...

  4. ASP.NET MVC 页面使用富文本控件的XSS漏洞问题

    目前在做的项目存在XSS安全漏洞! 原因是有一些页面使用了富文本编辑框,为了使得其内容可以提交,为相关action设置了[ValidateInput(false)] 特性: [HttpPost] [V ...

  5. 海康DS NVR播放URL规则

    URL规定:rtsp://username:password@<address>:<port>/Streaming/Channels/<id>(?parm1=val ...

  6. uva 10733 The Colored Cubes<polya定理>

    链接:http://uva.onlinejudge.org/external/107/10733.pdf 题意: N 种颜色可以涂成多少种立方体~ 思路: 使正六面体保持不变的运动群总共有: 1.不变 ...

  7. 虚拟化(四):vsphere高可用功能前提-共享存储搭建(使用微软提供的iscsi software target,也可以使用免费开源的openfiler)

    虚拟化(一):虚拟化及vmware产品介绍 虚拟化(二):虚拟化及vmware workstation产品使用 虚拟化(三):vsphere套件的安装注意及使用 虚拟化(四):vsphere高可用功能 ...

  8. PHP开发工作心得

    一.扎实PHP自身的基础知识.函数.常量等,尽量用内置的方法解决这个问题(由于个人写的往往运行效率没有内置方法高): 二.代码尽量少的实现功能(由于PHP的运行事实上是,将咱们的代码先处理成底层语言进 ...

  9. OC浅析一

    Objective-C是一门简单的语言,95%是C.只是在语言层面上加了些关键字和语法.真正让Objective-C如此强大的是它的运行时.它很小但却很强大.它的核心是消息分发. 在Objective ...

  10. Appium java 环境配置

    一.安装node.js 下载地址:http://pan.baidu.com/s/1qYyNDm8 点击安装,next下一步就ok. 安装完成,命令行输入:npm 这样显示的话就ok了.  二.下载Ap ...