MySQL優化(5):分區

来源:https://www.cnblogs.com/xuyiqing/archive/2020/03/11/12462539.html
-Advertisement-
Play Games

分區: 分區也是MySQL優化中的一個重要方式 將一個表中的數據和索引,分散到不同的文件中進行存儲 通常情況下,一個表,對應一組數據和索引文件,一個表的數據和索引集中存儲在這組文件中 當一個表出現了大量的記錄時,可以將其分佈到不同的數據和索引文件中進行存儲 Innodb來說,一個表對應多個ibd文件 ...


分區:

分區也是MySQL優化中的一個重要方式

將一個表中的數據和索引,分散到不同的文件中進行存儲

通常情況下,一個表,對應一組數據和索引文件,一個表的數據和索引集中存儲在這組文件中

 當一個表出現了大量的記錄時,可以將其分佈到不同的數據和索引文件中進行存儲

Innodb來說,一個表對應多個ibd文件

MyISAM來說,一個表對應多個myi,myd文件

 

分佈之後,每個文件中包含的記錄數量顯著減少,保證單獨文件的執行效率

 

最常用的分區語法是:使用ID,將數據分佈到多個分區中

在設計表的時候使用partition選項完成分區,需要提供分區演算法和演算法參數,完成分區操作

create table [table-name](
id int unsigned auto_increment primary key,
subject varchar(255),
content text
)charset utf8 engine innodb
partition by hash(id) partitions 10
;

正常的建表語句,最後一行表示利用ID欄位,使用HASH演算法,將數據分佈到十個分區內

建表成功之後,可以發現資料庫中雖然只是一張表,但是文件夾中會有十個ibd文件,一個frm文件(結構文件)和一個par文件(分區結構文件)

 

分區成功後:客戶端和以前沒有任何區別,只是伺服器端將數據分散到了不同的分區中存儲

當前例子,使用HASH演算法,利用ID值求餘的演算法,通過餘數將記錄分佈到某個分區中

HASH(ID)演算法,邏輯上表示將記錄均勻地分佈到不同的區域中,該演算法也是使用最廣最常用的演算法

適用於數據量很大但是沒有明顯的邏輯區分時,使用該演算法

 

MySQL提供了四種分區演算法:HASH演算法,KEY演算法,RANGE演算法,LIST演算法

HASH演算法:

上文講了,使用一個整數的值,將記錄分佈到分區中,採用求餘方案;

(哈希是一類演算法,使用某個輸入可以得到某個特定的輸出,相同輸入那麼輸出也相同)

 

KEY演算法:

和HASH演算法很像,是一個更加通用的HASH演算法

HASH中只能對整數求餘運算,而KEY演算法可以使用非整型欄位,輸入數據不一定是整數

我們進行分區的時候,可以不採用KEY(ID),而使用字元串KEY(username)

註意:分區要求必須是主鍵的一部分,這裡需要primary key(id,username),分區欄位一定是強檢索欄位

 

RANGE演算法:

一種條件分區演算法,將數據使用某種條件分散到不同的區中

範圍條件演算法,主要使用小於來實現條件

使用示例:利用文章的發佈時間,將文章分佈到不同的區域中:

create table articles(
id ...
subject ...
content ...
pubtime int,
primary key (id,pubtime)
)charset=utf8 engine=innodb
partition by range(pubtime) (
partition p201710 values less than (1509465599),
partition p201711 values less than (1512057599),
partition p201712 values less than (1514735999)
);

分為10月11月12月三個月,後邊的數字是時間戳,p201710是自己進行命名的

 

LIST演算法:

 一種條件分區,條件使用IN

使用示例:文章狀態,1代表正在寫,2代表已保存,3代表發佈

create table articles(
id ...
subject ...
content ...
pubtime int,
status tinyint,
primary key (id,status)
)charset=utf8 engine=innodb
partition by list(status) (
partition writing values in (1,2),
partition published values in (3)
);

那麼這裡就將文章分為已發佈和未發佈兩個分區

 

分區的管理語法:

對於LIST和RANGE可以刪除和新增分區:

添加分區

alter table articles add partition(
partition p201801 values less than (1517414400),
partition p201802 values less than (1519833600)
);

刪除分區,刪除分區後,分區的數據也會隨之刪除,不可恢復

alter table articles drop partition p201710;

 

對於HASH和KEY可以修改分區的數量:

在原有的基礎上再加四個分區,數據不丟失

alter table artiles add partiotion partitions 4;

合併為六個分區(註意語法中沒有partitions,而且數據不會丟失)

alter table articles coalesce partition 6;

加入和合併分區由於要保證數據不丟失,所以效率較低,時間較長

 

總結:

(1)分區是在客戶端程式不變的情況下,將伺服器端數據分佈到不同的物理文件中

(2)當數據表中數據量很大的時候,分區可以提升效率,只有檢索欄位為分區欄位的時候,分區效率才會比較明顯

(3)可以將分區文件部署到不同的磁碟上,充分利用磁碟的性能

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原帖地址:http://www.ptbird.cn/mapreduce-tempreture.html 「 Hadoop」mapreduce對溫度數據進行自定義排序、分組、分區等 一、需求說明 1、數據文件說明 hdfs中有一些存儲溫度的數據文件,以文本形式存儲,示例如下: 日期和時間中間是空格,為 ...
  • 介紹MySQL 事務的ACID特性、隔離級別以及臟讀、不可重覆讀和幻讀等內容 ...
  • 場景 Centos中Redis的下載編譯與安裝(超詳細): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103967334 Redis的啟動和關閉(前臺啟動和後臺啟動): https://blog.csdn.net/BADAO_ ...
  • DDL執行 線上伺服器執行DDL,更新表結構,需要謹慎,結構更改會導致全表被獨占鎖定(新版本有改善) 避免這種情況,使用COPY策略,而不是直接執行ALTER TABLE語句 思路:創建一個新表,滿足新要求,將舊表數據逐條導入新表,同時表上可以執行其他任務,導入的過程其他任務都記錄在日誌,導入完成後 ...
  • 關係數據結構 列:對象某一方面的特征 行:一個對象各個方面的特征 關係模型的數據結構是單一的關係,關係模型的數據結構是一張扁平的二維表,實體以及實體間的聯繫均用二維表來表示,關係模型建立在集合代數的基礎上 外碼:設F是基本關係R的一個或一組屬性,它不是R的碼,KS是基本關係S的主碼,如果F與KS相對 ...
  • NDB群集安裝 介紹 https://dev.mysql.com/doc/refman/8.0/en/mysql-cluster-basics.html NDBCLUSTER (也稱為NDB)是一種記憶體存儲引擎,提供高可用性和數據持久性功能。 的NDBCLUSTER存儲引擎可以與一系列故障切換和負載 ...
  • 分表 通常指:通過應用程式層,將數據劃分到不同的表中進行存儲 對比分區,分區是在伺服器層完成的分區演算法 分表會導致客戶端明顯的改變,在伺服器端出現結構相同的多張表,甚至可以把多張表分到不同的伺服器上 以賬單表為例:資料庫可能會有這樣的情況 create table bill201710( id in ...
  • 第八章 游標和觸發器 初識游標 在PL/SQL塊中執行SELECT、INSERT、DELETE和UPDATE語句時,ORACLE會在記憶體中為其分配上下文區(Context Area),即緩衝區。游標是指向該區的一個指針,或是命名一個工作區(Work Area),或是一種結構化數據類型。它為應用等量齊 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...