mysql分區/分片
阿新 • • 發佈:2017-12-20
運算 val char 主鍵 數據庫表 explain命令 範圍 category 插入 :範圍分區, 基於一個給定的連續範圍, 把數據分配到不同的分區, 如:時間範圍, 或者id自增長的, 1-10萬 ,10-20萬條數據
LIST分區: 類似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。 比如: 表內10條數據, id 1-10 , 將 id等於 1,3,5,7,9 放第一個分區, 2,4,6,8,10 放第二個分區 , 分區鍵等於特定的某個值
· HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含MySQL 中有效的、產生非負整數值的任何表達式。如: 將id為字符串類型的uuid 通過hash計算, 均勻的分配到 4個分區中
· KEY分區 :類似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
Columns分區: mysql5.5以後引入的分區,主要解決5.5以前 分區鍵只能是整形的問題, columns 細分為list columns 和 Range columns 分區, 支持 整型,字符串和時間類型.
RANGE分區案例:
按照日期的年分表, 通過Year函數獲取分區鍵的具體年份, VALUES LESS 表示少於1991年的放入p0, 類推
時間函數,TO_DAYS和 TO_SECONDS(我當前版本5.5支持) 可以讓你更精確的分到天甚至秒.
PARTITION p3 VALUES LESS THAN MAXVALUE 是防止超過你設置的分區的話,都會存在最後一個分區內.
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT ‘1989-01-01‘,
separated DATE NOT NULL DEFAULT ‘2016-12-14‘,
job_code INT,
store_id INT
)
PARTITION BY RANGE (YEAR(separated)) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
RANGE分區應用
特別適用於有分區條件的查詢和統計, 可以非常有效的避免全表掃描. 比如要查詢時間範圍在1991 年以前的數據, 只會掃描p0 ,可以用mysql explain命令查看.
LIST分區 案例:
按照分類的具體id分區, 如果插入的數據, 超出以下這幾個固定值, 則會報錯.
mysql 5.5 以後支持 非整數分區了, 下邊的分類id 就可以換成具體的分類字符串了
CREATE TABLE employees2 (
id INT NOT NULL,
category INT
)PARTITION BY LIST(category)(
PARTITION p0 VALUES IN (3,5),
PARTITION p1 VALUES IN (1,2),
PARTITION p2 VALUES IN (4),
PARTITION p3 VALUES IN (7,8)
);
HASH分區案例:
主要是針對分區鍵進行一個散列函數計算, 來確定數據到底放到哪個分區,hash分區主要分為兩種, 一種是常規的hash分區, 算法就是取模運算, 另外一種就是線性2的冪的運算.
創建的語法上後者比前者多了一個LINEAR 比如: PARTITION BY LINEAR HASH(store_id) PARTITIONS 4;
兩者的優缺點: 取模運算的hash分區,在進行分區管理, 比如curd分區的時候, 處理工作會非常的浩大, 歸根就是取模算法的問題.
線程運算的hash就沒這個問題, 但是相對於取模運算, 這個算法導致數據的存儲不是很均勻
CREATE TABLE employees3 (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT ‘1989-01-01‘,
separated DATE NOT NULL DEFAULT ‘9999-12-31‘,
job_code INT,
store_id INT
)
PARTITION BY HASH(store_id) PARTITIONS 4;
Key分區案例
跟範圍分區很想, 區別是範圍分區是通過一個表達式將分區鍵進行計算得到的一個具體的值來進行分區, 而key分區直接通過一個具體的值進行計算
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
一.分區概念
mysql 5.1 以後支持分區, 有點類似MongoDB中的分片概念. 就是按照一定的規則, 將一個數據庫表分解成很多細小的表, 這些細小的表可以是物理的分區, 就是在不同的位置. 但是站在應用的角度來看,分區又是透明的, 整體上看起來還是一個表,不影響使用. 二.分區優點 1 可以存儲更多的內容, 因為物理上可以放在不同的位置. 2 提高查詢效率, 如果分區的時候按照特定的規則, 將符合特定要求數據放在同一個分區內, 比如按照時間分區,查詢的時候只要掃描某一個或幾個分區即可. 三.分區鍵以及分區類型 mysql的表要分區, 那麽問題就來了, 到底按照什麽分呢,怎麽分呢? mysql分區有個分區鍵的概念, 根據分區鍵去分區的, 分區鍵要麽是主鍵,或者唯一鍵, 要麽這個表沒有主鍵/ 唯一鍵. 舉個栗子: 如果你創建一張表, 想按照時間字段年或者月去分區的話, 這個表要麽時間字段是主鍵, 要麽沒有主鍵. 分區類型 RANGE分區mysql分區/分片