分區表和分表

分區表(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.pswp.cn/diannao/73749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73749.shtml
英文地址,請注明出處:http://en.pswp.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…