当前位置: 首页 > news >正文

[SQL系列] 从头开始学PostgreSQL 分库分表

什么是分库分表

        分库分表是一种数据库架构设计的方法,用于应对大规模数据的存储和查询。当单个数据库的存储容量或查询性能无法满足需求时,可以通过将数据分散存储在多个数据库服务器上,以提高系统的可扩展性和性能。
        分库分表通常包括两个步骤:分库和分表。

分库

        分库是指将单个数据库按照一定规则划分为多个数据库,每个数据库可以存储一部分数据。这样可以减少单个数据库的数据量,提高查询效率。常见的分库方式包括垂直分库和水平分库。

        垂直分库是指按照功能模块或业务领域将数据分成多个数据库。例如,可以将订单数据、用户数据、商品数据分别存储在不同的数据库中。
        水平分库是指按照数据特征将数据分成多个数据库,例如按照时间、地理位置等。例如,可以将订单数据按照月份分别存储在不同的数据库中。

分表

        分表是指将单个表按照一定规则划分为多个表,每个表可以存储一部分数据。这样可以减少单个表的数据量,提高查询效率。常见的分表方式包括垂直分表和水平分表。
        垂直分表是指按照功能模块或业务领域将表分成多个部分。例如,可以将订单表按照订单状态分成多个部分。
        水平分表是指按照数据特征将表分成多个部分,例如按照时间、地理位置等。例如,可以将订单表按照月份分别存储在不同的表中。

从PostgreSQL 11开始,就有三种表分区:

        1. 范围分区(Range Partition)

        范围分区是将表按照某个列的值划分成一段或多段。每个分区的端点值存储在 pg_partition_range 系统表中。范围分区支持基于时间戳的自动分区,例如根据日期列自动创建每天、每月、每年等分区。

        2. 列表分区(List Partition)

        列表分区是将表按照某个列的值存储在数组中,每个分区的值存储在 pg_partition_list 系统表中。列表分区的支持比较灵活,可以自定义分区值,也可以使用预先定义好的列表进行分区。
        3. 哈希分区(Hash Partition)
        哈希分区是将表按照某个列的值进行哈希运算,将结果映射到不同的分区。哈希分区可以使用任何哈希函数,例如 MD5、SHA1 等。哈希分区的优点是可以平均分布数据,避免某个分区存储过多数据,提高查询效率。

示例

1. 创建主表

        首先,我们需要创建一个主表,用于存储所有分表的公共字段和索引。在示例中,我们创建一个名为 customers 的表,其中包含 id、name、age 和 address 列。

testdb=# CREATE TABLE customers (  id SERIAL PRIMARY KEY,  name VARCHAR(50) NOT NULL,  age INT NOT NULL,  address VARCHAR(100) NOT NULL  
);

2. 创建分表

        接下来,我们需要创建多个分表,每个分表都包含主表的所有字段和额外的特定字段。在示例中,我们创建年龄分区表

user=# create table customers_10 () inherits (customers);
CREATE TABLE
user=# create table customers_20 () inherits (customers);
CREATE TABLE
user=# create table customers_30 () inherits (customers);
CREATE TABLE
user=#user=# \dList of relationsSchema |         Name          |   Type   | Owner
--------+-----------------------+----------+-------public | customers             | table    | userpublic | customers_10          | table    | userpublic | customers_20          | table    | userpublic | customers_30          | table    | user

3. 定义分表规则

        使用 PostgreSQL 提供的分表规则(partitioning)功能,定义如何将数据分配到不同的分表中。在示例中,我们使用 AGE 列作为分表规则,将数据分配到 customers_age 分表中。

首先创建一个function,年龄为 (0,10), [10,20), [20, ...)分别插入三张不同的表里。

然后创建一个trigger,在插入到customers之前开始执行这个function。

这样子当我们向这个customers表插入数据的时候

user=# create or replace function customers_partition_trigger()
returns trigger as $$
begin
if NEW.age < 10 then
insert into customers_10 values (NEW.*);
elseif NEW.age < 20 then
insert into customers_20 values (NEW.*);
else insert into customers_30 values (NEW.*);
end if;
return null;
end;
$$
language plpgsql;
CREATE FUNCTIONuser=# create trigger insert_customers_partition_trigger
user-# before insert on customers
user-# for each row execute procedure customers_partition_trigger();
CREATE TRIGGER

4. 向表中插入数据,这里数据仍会显示在父表中,但是实际上父表仅仅作为整个分区表结构的展示,实际插入的记录是保存在子表中。

user=# INSERT INTO customers VALUES (1, 'Alice', 25, 'New York');
INSERT 0 0
user=# INSERT INTO customers VALUES (2, 'Bob', 35, 'San Francisco');
INSERT 0 0
user=# INSERT INTO customers VALUES (3, 'Charlie', 18, 'Chicago');
INSERT 0 0
user=# INSERT INTO customers VALUES (3, 'Charlie', 18, 'Chicago');
INSERT 0 0
user=# select * from customers;id |  name   | age |    address
----+---------+-----+---------------3 | Charlie |  18 | Chicago3 | Charlie |  18 | Chicago1 | Alice   |  25 | New York2 | Bob     |  35 | San Francisco
(4 rows)user=# select * from customers_10;id | name | age | address
----+------+-----+---------
(0 rows)user=# select * from customers_20;id |  name   | age | address
----+---------+-----+---------3 | Charlie |  18 | Chicago3 | Charlie |  18 | Chicago
(2 rows)user=# select * from customers_30;id | name  | age |    address
----+-------+-----+---------------1 | Alice |  25 | New York2 | Bob   |  35 | San Francisco
(2 rows)

5. 设置分表约束,加快查询效率。因为如果查询主表的话,会直接扫描所有的子表来查询,但是如果加上constraint的话,会允许规划器根据条件查询对应的子分区,在数据很多的情况下可以加快查询速度。

user=# alter table customers_10
user-# add constraint customers_10_check_age_key
user-# check (age < 10);
ALTER TABLEuser=# alter table customers_20
user-# add constraint customers_20_check_age_key
user-# check (age < 20);
ALTER TABLEuser=# alter table customers_30
user-# add constraint customers_30_check_age_key
user-# check (age < 30);
ALTER TABLE

优缺点

分库分表都有 一定的优缺点,下面来盘点下。

优点

  • 提高系统可扩展性:通过将数据分散存储在多个数据库服务器上,可以提高系统的可扩展性,方便扩展存储容量和处理能力。
  • 提高系统性能:通过将数据分散存储在多个数据库服务器上,可以提高系统的性能,减少单个数据库的压力。
  • 降低数据冗余:通过将数据分散存储在多个数据库服务器上,可以降低数据冗余,减少数据丢失的风险。

缺点

  • 复杂性:分库分表需要对数据进行划分和维护,增加了系统的复杂性和维护成本。
  • 数据一致性:分库分表可能导致数据不一致,需要额外的机制来保证数据的一致性。
  • 事务处理:分库分表可能会影响事务的处理,需要额外的机制来支持跨库的事务处理。

相关文章:

[SQL系列] 从头开始学PostgreSQL 分库分表

什么是分库分表 分库分表是一种数据库架构设计的方法&#xff0c;用于应对大规模数据的存储和查询。当单个数据库的存储容量或查询性能无法满足需求时&#xff0c;可以通过将数据分散存储在多个数据库服务器上&#xff0c;以提高系统的可扩展性和性能。 分库分表通常包…...

【VScode】Remote-SSH XHR failed无法访问远程服务器

问题概述 当使用VScode连接远程服务器时&#xff0c;往往需要使用Remote-SSH这个插件。而该插件有一个小bug&#xff0c;当远程服务器网络不佳时容易出现。 在控制台会出现下述语句&#xff1a; Resolver error: Error: XHR failed at y.onerror (vscode-file://vscode-app/…...

pycharm打开terminal报错

Pycharm打开终端报错如何解决&#xff1f;估计是终端启动conda不顺利&#xff0c;需要重新设置路径。参考以下文章的做法即可。 Windows下Pycharm中Terminal无法进入conda环境和Python Console 不能使用 给pycharm中Terminal 添加新的shell&#xff0c;才可以使用conda环境 W…...

C#与C/C++交互(1)——需要了解的基础知识

【前言】 C#中用于实现调用C/C的方案是P/Invoke&#xff08;Platform Invoke&#xff09;&#xff0c;让托管代码可以调用库中的函数。类似的功能&#xff0c;JAVA中叫JNI&#xff0c;Python中叫Ctypes。 常见的代码用法如下&#xff1a; [DllImport("Test.dll", E…...

LeetCode笔记:Weekly Contest 356

LeetCode笔记&#xff1a;Weekly Contest 356 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接&#xff1a;https://leetcode.com/contest/weekly-contest-356/ 1. 题目一…...

2 Python的基础语法

概述 在上一节的内容中&#xff0c;我们介绍了Python的诞生、发展历程、特色、缺点和应用领域。从本节开始&#xff0c;我们将正式学习Python。Python是一门简洁和优雅的语言&#xff0c;有自己特殊的一些语法规则。因此&#xff0c;在介绍Python编程的有关知识之前&#xff0c…...

抖音seo矩阵系统源代码开发搭建技术分享

抖音SEO矩阵系统是一个较为复杂的系统&#xff0c;其开发和搭建需要掌握一定的技术。以下是一些技术分享&#xff1a; 技术分享 抖音SEO矩阵系统的源代码可以使用JAVA、Python、PHP等多种语言进行开发。其中&#xff0c;JAVA语言的应用较为广泛&#xff0c;因为JAVA语言有良好…...

python#django数据库一对一/一对多/多对多

一对一OneToOneField 用户和用户信息 搭建 # 一对一 class TestUser(models.Model): usernamemodels.CharField(max_length32) password models.CharField(max_length32) class TestInfo(models.Model): mick_namemodels.CharField(max_length32) usermode…...

记RT-Thread rt_timer_start函数的问题

我使用的RT-Thread版本为4.0.3。 我看了5.0.1的代码&#xff0c;此问已经被修复。 在4.0.3版本中的rt_timer_start函数源码如下&#xff1a; rt_err_t rt_timer_start(rt_timer_t timer) {unsigned int row_lvl;rt_list_t *timer_list;register rt_base_t level;rt_list_t *r…...

C++初阶——拷贝构造和运算符重载(const成员)

目录 1. 拷贝构造函数 1.2 拷贝构造函数特征&#xff1a; 2. 默认拷贝构造函数 2.1 未显式定义&#xff0c;编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝&#xff0c;这种拷贝叫做浅拷贝&#xff0c;或者值拷贝 3. 运算符重载 3.1…...

go练习 day01

DTO: note_dto.go package dtoimport "king/model"type NoteAddDTO struct {ID uintTitle string json:"title" form:"title" binding:"required" message:"标题不能为空"Content string json:"conten…...

C# Blazor 学习笔记(0.1):如何开始Blazor和vs基本设置

文章目录 前言资源推荐环境如何开始Blazor个人推荐设置注释快捷键热重载设置 前言 Blazor简单来说就是微软提供的.NET 前端框架。使用 WebAssembly的“云浏览器”&#xff0c;集成了Vue,React,Angular等知名前端框架的特点。 资源推荐 微软官方文档 Blazor入门基础视频合集 …...

原码的乘法运算 补码乘法运算

补码乘法 对比...

找不到d3dx9_43.dll丢失怎么解决(分享几种解决方法)

为什么我们打开电脑软件或许游戏时候&#xff0c;电脑会报错出现d3dx9_43.dll丢失&#xff0c;或许找不到d3dx9_43.dll等等的提示。下面来详细介绍一下d3dx9_43.dll详细解决方法跟d3dx9_43.dll是什么。 如果你的系统中没有安装或安装不完整的d3dx9_43.dll运行时&#xff0c;应…...

篇四:建造者模式:逐步构造复杂对象

篇四&#xff1a;“建造者模式&#xff1a;逐步构造复杂对象” 设计模式是软件开发中的重要组成部分&#xff0c;建造者模式是创建型设计模式中的一种。建造者模式旨在逐步构造复杂对象&#xff0c;将对象的构造与其表示分离&#xff0c;从而使得同样的构建过程可以创建不同的…...

vs导出和导入动态库和静态库

1. 动态库和导出和导入 1.1 动态库的导出 1. 创建新项目 新建新项目&#xff0c;选择动态链接库&#xff08;DLL&#xff09;。 填写项目名称&#xff0c;并选择项目保存的路径&#xff0c;然后点击创建。 创建完成后&#xff0c;会自动生成如下所示文件&#xff0c;可以根据…...

30 使用easyExcel依赖生成Excel

30.1 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId&…...

排序进行曲-v2.0

文章目录 小程一言直接插入排序步骤举例复杂度分析应用场景实际举例代码实现 希尔排序步骤举例复杂度分析应用场景实际举例代码实现 堆排序步骤举例复杂度分析应用场景实际举例代码实现 小程一言 这篇文章是在排序进行曲1.0之后的续讲&#xff0c; 由于在上一篇讲的排序的基本…...

反弹shell的N种姿势

预备知识1. 关于反弹shell 就是控制端监听在某TCP/UDP端口&#xff0c;被控端发起请求到该端口&#xff0c;并将其命令行的输入输出转到控制端。reverse shell与telnet&#xff0c;ssh等标准shell对应&#xff0c;本质上是网络概念的客户端与服务端的角色反转。2. 反弹shel…...

创意视频剪辑教程:快速合并视频并标题,让你的作品更吸睛!

想要让你的视频作品脱颖而出&#xff0c;引人注目&#xff1f;不再担心&#xff0c;我们为你带来了一款创意视频剪辑教程&#xff0c;教你如何快速合并视频并添加令人惊艳的标题效果&#xff01;让你的作品在分钟内变得酷炫而精彩&#xff0c;向世界展示你的创意&#xff01; …...

[AI/应用/MCP] MCP Server/Tool 开发指南

1. 智能软件工程的范式转移&#xff1a;从库集成到原生框架演进 在生成式人工智能&#xff08;Generative AI&#xff09;从单纯的文本生成向具备自主规划与执行能力的“代理化&#xff08;Agentic&#xff09;”系统跨越的过程中&#xff0c;.NET 生态系统正在经历一场自该平台…...

Go Context 取消信号传播机制剖析

Go Context 取消信号传播机制剖析 在并发编程中&#xff0c;如何优雅地控制协程的生命周期是一个关键问题。Go语言通过Context机制提供了一种统一的取消信号传播方式&#xff0c;使得跨协程、跨层级的任务取消变得简单高效。本文将深入剖析Context的取消信号传播机制&#xff…...

MSSQL03:SQLServer数据库中的高级语法及其技巧

目录 一、日期相关 1.查询当前日期相关数据 2.查询特定时间区间 3.时间加减法 &#xff08;1&#xff09;加法 &#xff08;2&#xff09;减法 4.格式化日期 二、数据类型转化 1.Int -> Decimal 2.DateTime->OtherTime 3.DateTime->string 三、条件判断相关…...

GLM-4v-9b效果展示:直播带货截图→话术分析+转化点提炼

GLM-4v-9b效果展示&#xff1a;直播带货截图→话术分析转化点提炼 1. 模型能力概览 GLM-4v-9b是智谱AI在2024年开源的多模态视觉-语言模型&#xff0c;拥有90亿参数。这个模型最大的特点是能够同时理解图片和文字&#xff0c;支持中英文多轮对话&#xff0c;在11201120高分辨…...

CosyVoice2-0.5B效果实测:背景噪音音频对克隆效果影响量化

CosyVoice2-0.5B效果实测&#xff1a;背景噪音音频对克隆效果影响量化 1. 测试背景与目的 声音克隆技术近年来发展迅猛&#xff0c;阿里开源的CosyVoice2-0.5B作为一款强大的零样本语音合成系统&#xff0c;能够在短短3秒内复刻任意说话人的声音。但在实际应用中&#xff0c;…...

UDOP-large高性能部署:Tesseract OCR预处理与UDOP-large联合加速方案

UDOP-large高性能部署&#xff1a;Tesseract OCR预处理与UDOP-large联合加速方案 1. 引言&#xff1a;当文档理解遇上效率瓶颈 想象一下&#xff0c;你手头有几百份英文PDF报告需要处理。你需要从中提取标题、摘要&#xff0c;甚至表格里的关键数据。传统的方法是&#xff1a…...

保姆级教程:用yangipcclient RN SDK 8.0快速给你的App加上实时对讲功能

保姆级实战&#xff1a;React Native应用集成实时对讲功能的完整指南 想象一下&#xff0c;你正在开发一款智能家居控制应用&#xff0c;用户反馈最强烈的需求是能够直接与家中的设备进行语音对讲。或者你负责的教育类App&#xff0c;小组讨论时缺少高效的实时语音沟通工具。传…...

Jar Analyzer:提升Java开发效率的全方位JAR分析工具

Jar Analyzer&#xff1a;提升Java开发效率的全方位JAR分析工具 【免费下载链接】jar-analyzer Jar Analyzer - 一个 JAR 包 GUI 分析工具&#xff0c;方法调用关系搜索&#xff0c;方法调用链 DFS 算法分析&#xff0c;模拟 JVM 的污点分析验证 DFS 结果&#xff0c;字符串搜索…...

Ubuntu纯键盘操作全攻略:从入门到精通(附常用快捷键速查表)

Ubuntu纯键盘操作全指南&#xff1a;释放效率革命的终极手册 在数字工作流中&#xff0c;每一次伸手去摸鼠标都意味着思维的中断和效率的流失。Ubuntu作为最受欢迎的Linux发行版之一&#xff0c;其键盘操作体系之丰富远超多数用户的想象——从简单的窗口切换到底层系统调试&…...

微信聊天记录永久保存终极指南:WeChatMsg免费工具完整解决方案

微信聊天记录永久保存终极指南&#xff1a;WeChatMsg免费工具完整解决方案 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…...