分区表和分表

分区表(Partitioning)

定义

  • 分区表是将单个表的数据按照某种规则(如范围、列表、哈希等)划分为多个逻辑部分,每个部分称为一个分区。
  • 数据仍然存储在一个物理表中,但逻辑上被分割为多个分区。

特点

  • 逻辑划分:分区是对表内数据的逻辑划分,物理上仍然是一个表。
  • 透明性:对用户来说,分区表的操作与普通表无异,无需修改 SQL 查询。
  • 存储位置:分区可以存储在不同的物理位置(如不同的磁盘),以提升 I/O 性能。

常见分区方式

1. 范围分区(RANGE Partitioning)

  • 定义:按字段值范围划分分区。
  • 特点
    • 适合连续范围的数据(如时间、数值)。
    • 需要指定每个分区的上限值。
  • 示例
CREATE TABLE sales (sale_id INT NOT NULL,sale_date DATE NOT NULL
)
PARTITION BY RANGE (YEAR(sale_date)) (PARTITION p2022 VALUES LESS THAN (2023),PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025)
);

2. 列表分区(LIST Partitioning)

  • 定义:按字段的离散值划分分区。
  • 特点
    • 适合固定分类的数据(如地区、状态)。
    • 每个分区明确列出允许的值。
  • 示例
CREATE TABLE customers (customer_id INT NOT NULL,region VARCHAR(50) NOT NULL
)
PARTITION BY LIST COLUMNS(region) (PARTITION p_north VALUES IN ('North'),PARTITION p_south VALUES IN ('South'),PARTITION p_east VALUES IN ('East'),PARTITION p_west VALUES IN ('West')
);

3. 哈希分区(HASH Partitioning)

  • 定义:按字段的哈希值将数据分布到多个分区。
  • 特点
    • 数据均匀分布,适合负载均衡。
    • 分区数量由 PARTITIONS 指定。
  • 示例
CREATE TABLE users (user_id INT NOT NULL,username VARCHAR(50)
)
PARTITION BY HASH(user_id)
PARTITIONS 4;

4. 键分区(KEY Partitioning)

  • 定义:使用 MySQL 内部哈希函数对字段进行分区。
  • 特点
    • 类似于哈希分区,但支持非整数字段。
    • 自动选择分区键。
  • 示例
CREATE TABLE products (product_id INT NOT NULL,product_name VARCHAR(50)
)
PARTITION BY KEY(product_name)
PARTITIONS 4;

5. 范围列分区(RANGE COLUMNS Partitioning)

  • 定义:按一个或多个字段直接分区,无需表达式。
  • 特点
    • 支持多列分区。
    • 适合日期、时间等字段。
  • 示例
CREATE TABLE orders (order_id INT NOT NULL,create_time DATETIME NOT NULL
)
PARTITION BY RANGE COLUMNS(create_time) (PARTITION p2022 VALUES LESS THAN ('2023-01-01'),PARTITION p2023 VALUES LESS THAN ('2024-01-01'),PARTITION p2024 VALUES LESS THAN ('2025-01-01')
);

6. 列表列分区(LIST COLUMNS Partitioning)

  • 定义:按一个或多个字段的离散值分区。
  • 特点
    • 支持多列分区。
    • 适合多字段分类场景。
  • 示例
CREATE TABLE tasks (task_id INT NOT NULL,priority INT NOT NULL,region VARCHAR(50) NOT NULL
)
PARTITION BY LIST COLUMNS(priority, region) (PARTITION p_high_north VALUES IN ((5, 'North'), (10, 'North')),PARTITION p_low_south VALUES IN ((3, 'South'))
);

7. 子分区(Subpartitioning)

  • 定义:在主分区的基础上进一步划分子分区。
  • 特点
    • 支持组合分区(如 RANGE + HASH 或 LIST + HASH)。
    • 提供更细粒度的分区管理。
  • 示例
CREATE TABLE orders (order_id INT NOT NULL,order_date DATE NOT NULL,customer_id INT NOT NULL
)
PARTITION BY RANGE (YEAR(order_date))
SUBPARTITION BY HASH(customer_id) (PARTITION p2022 VALUES LESS THAN (2023) (SUBPARTITION p2022_sp1,SUBPARTITION p2022_sp2),PARTITION p2023 VALUES LESS THAN (2024) (SUBPARTITION p2023_sp1,SUBPARTITION p2023_sp2)
);

总结对比

分区方式特点示例字段类型
范围分区按连续范围分区数值、日期
列表分区按离散值分区地区、状态
哈希分区按哈希值均匀分布用户 ID、产品 ID
键分区使用 MySQL 内部哈希函数字符串、其他字段
范围列分区按字段直接分区,支持多列日期、时间
列表列分区按字段离散值分区,支持多列分类字段
子分区主分区基础上进一步划分子分区组合分区(RANGE+HASH)

优点

  • 提升查询性能:查询时只需扫描相关分区,减少 I/O 开销。
  • 简化管理:可以通过删除整个分区快速清理历史数据。
  • 支持大表:适合单表数据量较大的场景。

缺点

  • 单表限制:分区表本质上仍然是一个表,不能解决跨表查询的问题。
  • 分区规则固定:一旦分区规则确定后续调整较复杂

分表(Sharding)

MySQL 本身不直接支持分表,需要通过应用层或中间件实现

定义

  • 分表是将一个大表拆分为多个独立的物理表,每个表存储一部分数据。
  • 数据分布在多个表中,通常需要通过应用层或中间件来管理。

特点

  • 物理分离:分表是对数据的物理分离,每个表是一个独立的实体。
  • 分布式架构:分表通常与分布式数据库结合使用。
  • 手动管理:需要开发人员或中间件负责路由查询到正确的表。

常见分表方式

(1) 水平分表(Horizontal Sharding)

  • 按行拆分,每张表存储部分记录。例如,按用户 ID 范围分表:
    • users_0 存储用户 ID 为 0-999 的记录。
    • users_1 存储用户 ID 为 1000-1999 的记录。
  • 示例:按用户 ID 范围分表。
手动创建分表
-- 表1:存储用户ID为0-999的记录
CREATE TABLE users_0 (user_id INT NOT NULL,username VARCHAR(50)
);-- 表2:存储用户ID为1000-1999的记录
CREATE TABLE users_1 (user_id INT NOT NULL,username VARCHAR(50)
);
插入数据

根据用户 ID 决定插入哪个表:

-- 用户ID为500,插入users_0
INSERT INTO users_0 (user_id, username) VALUES (500, 'Alice');-- 用户ID为1500,插入users_1
INSERT INTO users_1 (user_id, username) VALUES (1500, 'Bob');
查询数据

需要手动路由查询:

-- 查询用户ID为500
SELECT * FROM users_0 WHERE user_id = 500;-- 查询用户ID为1500
SELECT * FROM users_1 WHERE user_id = 1500;

(2) 垂直分表(Vertical Sharding)

  • 按列拆分,将不同的字段分布到不同的表中。例如:
    • users_basic 存储用户的基本信息(ID、姓名)。
    • users_profile 存储用户的详细信息(地址、兴趣爱好)。
  • 示例:将用户的基本信息和详细信息分开。
创建分表
-- 基本信息表
CREATE TABLE users_basic (user_id INT NOT NULL,username VARCHAR(50)
);-- 详细信息表
CREATE TABLE users_profile (user_id INT NOT NULL,address VARCHAR(200),phone VARCHAR(20)
);
插入数据

分别插入基本信息和详细信息:

INSERT INTO users_basic (user_id, username) VALUES (1, 'Alice');
INSERT INTO users_profile (user_id, address, phone) VALUES (1, '123 Main St', '123-456-7890');
查询数据

需要联表查询:

SELECT b.user_id, b.username, p.address, p.phone
FROM users_basic b
JOIN users_profile p ON b.user_id = p.user_id
WHERE b.user_id = 1;

优点

  • 扩展性强:支持水平扩展,适合超大规模数据集
  • 提升性能:减少单表数据量,降低查询和写入压力。
  • 灵活性高:可以根据业务需求灵活设计分表策略

缺点

  • 管理复杂:需要额外的逻辑处理跨表查询和事务。
  • 数据一致性:分布式环境下的数据一致性和事务管理更复杂
  • 查询复杂度增加:需要手动处理表路由和聚合操作。

对比总结

特性分区表分表
数据存储单表内逻辑分区多个独立物理表
实现方式数据库内置功能应用层或中间件实现
透明性对用户透明,无需修改查询需要手动处理表路由和查询
扩展性有限,依赖单实例的硬件资源强,支持分布式架构
适用场景单表数据量较大,但仍在单机范围内数据量极大,需分布式存储和计算
跨表查询不涉及,仍是单表需要额外处理
事务支持数据库原生支持分布式事务需额外实现

使用场景示例

分区表

  • 日志系统:按日期范围分区,方便清理历史数据。
    CREATE TABLE logs (log_id INT,log_time DATETIME
    ) PARTITION BY RANGE (YEAR(log_time)) (PARTITION p2022 VALUES LESS THAN (2023),PARTITION p2023 VALUES LESS THAN (2024)
    );
    
  • 订单系统:按地区分区,提升区域查询性能。

分表

  • 电商系统
    • 按用户 ID 水平分表:orders_0orders_1,分别存储不同用户范围的订单。
    • 按业务垂直分表:orders_basic 存储订单基本信息,orders_details 存储订单详情。

总结

  • 分区表:适合单表数据量较大但仍在单机范围内的场景,操作简单且透明。
  • 分表:适合超大规模数据集,尤其是需要分布式存储和计算的场景,但管理和查询复杂度较高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++从入门到入土(八)——多态的原理

目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中,我们介绍了C三大特性之一的多态,我们主要介绍了多态的构成条件,但是对于多态的原理我们探讨的是不够深入的,下面这这一篇文章,我们将…

用Maven创建只有POM文件的项目

使用 mvn 创建一个仅包含 pom.xml 文件的父项目,可以借助 maven-archetype-quickstart 原型,然后移除不必要的文件,或者直接通过命令生成最简的 pom.xml 文件。以下是具体操作步骤: 一、方法一:使用原型创建后清理 1…

Linux目录理解

前言 最近在复习linux,发现有些目录总是忘记内容,发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下: 1. 根目录 / (Root Directory) 英文含义:/ 是文件系统的根…

gitee AI使用

gitee AI使用 gitee AI使用 gitee AI使用简介正文开始1. 安装openai2. 测试2.1 不使用流2.2 使用流 2.3 使用curl工具 简介 发现gitee 推出了个ai帮助多数人使用ai,突破算力和模型的壁垒,我就遵从开源精神,测试了下,希望可以帮助…

c++领域展开第十七幕——STL(vector容器的模拟实现以及迭代器失效问题)超详细!!!!

文章目录 前言vector——基本模型vector——迭代器模拟实现vector——容量函数以及push_back、pop_backvector——默认成员函数vector——运算符重载vector——插入和删除函数vector——实现过程的问题迭代器失效memcpy的浅拷贝问题 总结 前言 上篇博客我们已经详细介绍了vecto…

WPF 开发从入门到进阶(五)

一、WPF 简介与开发环境搭建 1.1 WPF 概述 Windows Presentation Foundation(WPF)是微软推出的用于构建 Windows 桌面应用程序的强大 UI 框架。它融合了矢量图形、动画、多媒体等多种技术,能让开发者创建出具有高度视觉吸引力和交互性的应用…

DICOM医学影像数据访问控制与身份验证技术应用的重要性及其实现方法详解

DICOM医学影像数据访问控制与身份验证技术应用的重要性及其实现方法详解 在现代医疗体系中,DICOM(数字成像和通信医学标准)作为医学影像数据的核心标准,扮演着至关重要的角色。随着医疗信息化的深入发展,DICOM医学影像数据的安全性和隐私保护成为医疗机构亟需解决的关键问…

植物知识分享论坛毕设

1.这四个文件直接是什么关系?各自都是什么作用?他们之间是如何联系的? 关系与联系 UserController.java 负责接收外部请求,调用 UserService.java 里的方法来处理业务, 而 UserService.java 又会调用 UserMapper.jav…

Business processes A bridge to SAP and a guide to SAP TS410 certification

Business processes A bridge to SAP and a guide to SAP TS410 certification

算法 之 ST表

文章目录 区间最大值 ST表(Sparse Table)是一种高效处理静态数据区间查询的数据结构,主要的作用是用于快速查询区间的最值,区间GCD,区间按位与或 在这里以区间最大值为例子说明st表的模版 总体的思想就是定义dp[i][j]表示下标为i长度为2^j的区间的最大值…

Deepseek X 文心智能体:谐音梗广告创意大师

体验链接 飞书文档 一、引言 在当今竞争激烈的市场环境下,广告创意对于产品或服务的推广至关重要。谐音广告以其独特的语言魅力,能够迅速吸引受众的注意力并留下深刻印象。本智能体旨在利用 DeepSeek 模型强大的语言分析和推理能力,为用户…

libilibi项目优化(2)视频文件分块上传

第一版 文件分片上传过程总结 整个文件分片上传过程分为三个主要步骤:预上传、分片上传和获取已上传分块信息。以下是每个步骤的详细描述: 1. 预上传(preUploadVideo) 功能:生成唯一的上传 ID,并将文件…

TCP简单链接的编程实现

TCP简单链接的编程实现 本文主要介绍TCP应用层的编码实现。 TCP是一种面向连接的、可靠的、基于字节流的传输层协议,它是互联网协议套件(TCP/IP)中的核心协议之一,广泛应用于需要可靠数据传输的场景,如:网…

使用Multiprocessing模块创建子进程,需要放到__main__中

1 场景说明 在Python中,使用multiprocessing模块创建子进程时,将创建子进程的代码放在if __name__ __main__: 块之外,如下面代码: import multiprocessing import timedef test_func(name):print(f"子进程 {name} 开始运行…

描述<canvas>标签的主要用途,如何在其上绘制简单图形?

大白话描述标签的主要用途&#xff0c;如何在其上绘制简单图形&#xff1f; <canvas> 标签的主要用途 <canvas> 标签是 HTML5 中新增的一个标签&#xff0c;它就像是一块“画布”&#xff0c;你可以在网页上用它来绘制各种图形、动画、制作游戏等。简单来说&…

【RHCE实验】搭建主从DNS、WEB等服务器

目录 需求 环境搭建 配置nfs服务器 配置web服务器 配置主从dns服务器 主dns服务器 从dns服务器 配置客户端 客户端测试 需求 客户端通过访问 www.nihao.com 后&#xff0c;能够通过 dns 域名解析&#xff0c;访问到 nginx 服务中由 nfs 共享的首页文件&#xff0c;内容…

Shell条件判断

一、使用if选择结构 if单分支的语法组成&#xff1a; if 条件测试;then 命令序列 fi if双分支的语法组成&#xff1a; if 条件测试;then 命令序列1 else 命令序列2 fi if多分支的语法组成&#xff1a; if 条…

理解langchain langgraph 官方文档示例代码中的MemorySaver

以下是langchain v0.3官方示例代码 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解为&#xff1a;定义一个流程&#xff0c;这个流程中用到的数据类型是Messages。 <---定义一个有向图&…

【HarmonyOS Next之旅】DevEco Studio使用指南(三)

目录 1 -> 一体化工程迁移 1.1 -> 自动迁移 1.2 -> 手动迁移 1.2.1 -> API 10及以上历史工程迁移 1.2.2 -> API 9历史工程迁移 1 -> 一体化工程迁移 DevEco Studio从 NEXT Developer Beta1版本开始&#xff0c;提供开箱即用的开发体验&#xff0c;将SD…

vuex持久化存储,手动保存到localStorage

vuex持久化存储&#xff0c;手动保存到localStorage 一、vue21. 手动存储到localStoragestore/index.js 2. 使用持久化存储插件store/index.jsstore/modules/otherData.js保存到localStorage 二、vue31. index.ts2. store/modules/globalData.ts3. 在组件中使用App.vue 一、vue…