溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

mysql分區(qū)使用命令詳情

發(fā)布時間:2020-04-27 11:25:23 來源:億速云 閱讀:300 作者:三月 欄目:軟件技術

下文內容主要給大家?guī)?a title="mysql" target="_blank" href="http://www.kemok4.com/mysql/">mysql分區(qū)使用命令詳情,這里所講到的知識,與書籍略有不同,都是億速云專業(yè)技術人員在與用戶接觸過程中,總結出來的,具有一定的經驗分享價值,希望給廣大讀者帶來幫助。

查看mysql是否支持分區(qū)需要使用命令:

show variables like %partition%';

如果沒有看到變量:have_partition_engine的值為YES,而是為empty,則說明當前mysql的版本就不支持分區(qū)。mysql從5.1開始支持分區(qū)功能。但是如果你使用mysql高于5.1版本卻出現empty的結果。改用:

show plugins

mysql分區(qū)使用命令詳情

出現partition active證明支持分區(qū)。

MySQL 表分區(qū)策略

 

RANGE 分區(qū)      基于屬于一個給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。

mysql分區(qū)使用命令詳情

 

 

DROP TABLE IF EXISTS `p_range`;

mysql分區(qū)使用命令詳情

 

CREATE TABLE `p_range` (

mysql分區(qū)使用命令詳情

 

`id` int(10) NOT NULL AUTO_INCREMENT,

mysql分區(qū)使用命令詳情

 

`name` char(20) NOT NULL,


 

mysql分區(qū)使用命令詳情

PRIMARY KEY (`id`)

mysql分區(qū)使用命令詳情

 

) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

mysql分區(qū)使用命令詳情

 

/*!50100 PARTITION BY RANGE (id)

mysql分區(qū)使用命令詳情

 

(PARTITION p0 VALUES LESS THAN (8) ENGINE = MyISAM) */;

 

最大值

mysql分區(qū)使用命令詳情

 

PARTITION BY RANGE (id)

mysql分區(qū)使用命令詳情

 

(

mysql分區(qū)使用命令詳情

 

PARTITION p0 VALUES LESS THAN (8),

mysql分區(qū)使用命令詳情

 

PARTITION p1 VALUES LESS THAN MAXVALUE)

 

適用場景:

 

這樣就表示,所有 id 大于 7 的數據記錄存在在 p1 分區(qū)里。

 

RANGE 分區(qū)在如下場合特別有用:

 

·     當需要刪除“舊的”數據時。如果你使用上面最近的那個例子給出的分區(qū)方案,你只需簡單地使用 “ALTER TABLE employees DROP PARTITION p0;”來刪除所有在 1991 年前就已經停止工作的雇員相對應的所有行。對于有大量行的表,這比運行一個如“DELETE FROM employees WHERE YEAR(separated) <=

 

1990;”這樣的一個 DELETE 查詢要有效得多。

 

·     想要使用一個包含有日期或時間值,或包含有從一些其他級數開始增長的值的列。

 

·     經常運行直接依賴于用于分割表的列的查詢。例如,當執(zhí)行一個如

 

“SELECT COUNT(*) FROM employees WHERE YEAR(separated) = 2000 GROUP BY store_id;”這樣的查詢時,MySQL 可以很迅速地確定只有分區(qū) p2 需要掃描,這是因為余下的分區(qū)不可能包含有符合該 WHERE 子句的任何記錄

 

 

 

LIST 分區(qū) 類似于按 RANGE 分區(qū),區(qū)別在于 LIST 分區(qū)是基于列值匹配一個離散值集合中的某個值來進行選擇。

mysql分區(qū)使用命令詳情

 

DROP TABLE IF EXISTS `p_list`;

mysql分區(qū)使用命令詳情

 

CREATE TABLE `p_list` (

mysql分區(qū)使用命令詳情

 

`id` int(10) NOT NULL AUTO_INCREMENT,

mysql分區(qū)使用命令詳情

 

`typeid` mediumint(10) NOT NULL DEFAULT '0',

mysql分區(qū)使用命令詳情

 

`typename` char(20) DEFAULT NULL,

mysql分區(qū)使用命令詳情

 

PRIMARY KEY (`id`,`typeid`)

mysql分區(qū)使用命令詳情

 

) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8

mysql分區(qū)使用命令詳情

 

/*!50100 PARTITION BY LIST (typeid)

mysql分區(qū)使用命令詳情

 

(PARTITION p0 VALUES IN (1,2,3,4) ENGINE = MyISAM, PARTITION p1 VALUES IN (5,6,7,8) ENGINE = MyISAM) */;

mysql分區(qū)使用命令詳情


 

 

HASH 分區(qū)  基于用戶定義的表達式的返回值來進行選擇的分區(qū),該表達

 

式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含 MySQL 中有效的、產生非負整數值的任何表達式。 HASH 分區(qū)主要用來確保數據在預先確定數目的分區(qū)中平均分布。在 RANGE 和 LIST 分區(qū)中,必須明確指定一個給定的列值或列值集合應該保存在哪個分區(qū)中;而在 HASH 分區(qū)中,MySQL 自動完成這些工作,你所要做的只是基于將要被哈希的列值指定一個列值或表達式,以及指定被分區(qū)的表將要被分割成的分區(qū)數量

mysql分區(qū)使用命令詳情

 

DROP TABLE IF EXISTS `p_hash`;

mysql分區(qū)使用命令詳情

 

CREATE TABLE `p_hash` (

mysql分區(qū)使用命令詳情

 

`id` int(10) NOT NULL AUTO_INCREMENT,

mysql分區(qū)使用命令詳情

 

`storeid` mediumint(10) NOT NULL DEFAULT '0',

mysql分區(qū)使用命令詳情

 

`storename` char(255) DEFAULT NULL,

mysql分區(qū)使用命令詳情

 

PRIMARY KEY (`id`,`storeid`)

mysql分區(qū)使用命令詳情

 

) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

mysql分區(qū)使用命令詳情

 

/*!50100 PARTITION BY HASH (storeid)

mysql分區(qū)使用命令詳情

 

PARTITIONS 4 */;

 

簡單點說就是數據的存入可以按 partition by hash(expr); 這里的 expr 可以

 

是鍵名也可以是表達式比如 YEAR(time),如果是表達式的情況下

 

但是應當記住,每當插入或更新(或者可能刪除)一行,這個表達式都要計

 

算一次;這意味著非常復雜的表達式可能會引起性能問題,尤其是在執(zhí)行同時

 

影響大量行的運算(例如批量插入)的時候。 ”

 

在執(zhí)行刪除、寫入、更新時這個表達式都會計算一次。

 

數據的分布采用基于用戶函數結果的模數來確定使用哪個編號的分區(qū)。換句話,對于一個表達式“expr”,將要保存記錄的分區(qū)編號為 N ,其中“N = MOD(expr, num)”。

 

比如上面的 storeid 為 10;那么 N=MOD(10,4) ;N 是等于 2 的,那么這條記錄就存儲在 p2 的分區(qū)里面。

 

如果插入一個表達式列值為'2005-09-15′的記錄到表中,那么保存該條記錄的分區(qū)確定如下:MOD(YEAR('2005-09-01′),4) = MOD(2005,4) = 1 ; 就存儲在 p1 分區(qū)里面了。

 

 

 

分區(qū)注意點

 

1、重新分區(qū)時,如果原分區(qū)里面存在 maxvalue 則新的分區(qū)里面也必須包含

 

maxvalue 否則就錯誤。

 

alter table p_range2x

 

reorganize partition p1,p2

 

into (partition p0 values less than (5), partition p1 values less than maxvalue);

 

[Err] 1520 – Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range


 

2、分區(qū)刪除時,數據也同樣會被刪除 alter table p_range drop partition p0;

 

3、如果 range 分區(qū)列表里面沒有 maxvalue 則如有新數據大于現在分區(qū) range 數據值那么這個數據是無法寫入到數據庫表的。

 

4、修改表名不需要 刪除分區(qū)后在進行更改,修改表名后分區(qū)存儲 myd myi 對應也會自動更改。

 

如果希望從所有分區(qū)刪除所有的數據,但是又保留表的定義和表的分區(qū)模式,使用 TRUNCATE TABLE 命令。(請參見 13.2.9 節(jié),“TRUNCATE 語法”)。

 

如果希望改變表的分區(qū)而又不丟失數據,使用“ALTER TABLE … REORGANIZE PARTITION”語句。參見下面的內容,或者在 13.1.2 節(jié),“ALTER TABLE 語法” 中參考關于 REORGANIZE PARTITION 的信息。

 

5、對表進行分區(qū)時,不論采用哪種分區(qū)方式如果表中存在主鍵那么主鍵必須在分區(qū)列中。表分區(qū)的局限性。

 

6、list 方式分區(qū)沒有類似于 range 那種 less than maxvalue 的寫法,也就是說 list 分區(qū)表的所有數據都必須在分區(qū)字段的值列表集合中。

 

7、在 MySQL 5.1 版中,同一個分區(qū)表的所有分區(qū)必須使用同一個存儲引擎;例如,不能對一個分區(qū)使用 MyISAM,而對另一個使用 InnoDB。

 

8、分區(qū)的名字是不區(qū)分大小寫的,myp1 與 MYp1 是相同的。

 

對于以上關于mysql分區(qū)使用命令詳情,如果大家還有更多需要了解的可以持續(xù)關注我們億速云的行業(yè)推新,如需獲取專業(yè)解答,可在官網聯系售前售后的,希望該文章可給大家?guī)硪欢ǖ闹R更新。


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI