下文內(nèi)容主要給大家?guī)鞰ySQL分區(qū)使用命令詳情,這里所講到的知識(shí),與書籍略有不同,都是創(chuàng)新互聯(lián)專業(yè)技術(shù)人員在與用戶接觸過程中,總結(jié)出來的,具有一定的經(jīng)驗(yàn)分享價(jià)值,希望給廣大讀者帶來幫助。
青州網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,青州網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為青州近1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個(gè)售后服務(wù)好的青州做網(wǎng)站的公司定做!
查看mysql是否支持分區(qū)需要使用命令:
show variables like %partition%';
如果沒有看到變量:have_partition_engine的值為YES,而是為empty,則說明當(dāng)前mysql的版本就不支持分區(qū)。mysql從5.1開始支持分區(qū)功能。但是如果你使用mysql高于5.1版本卻出現(xiàn)empty的結(jié)果。改用:
show plugins
出現(xiàn)partition active證明支持分區(qū)。
MySQL表分區(qū)策略
RANGE分區(qū) 基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
DROP TABLE IF EXISTS `p_range`;
CREATE TABLE `p_range` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` char(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (id)
(PARTITION p0 VALUES LESS THAN (8) ENGINE = MyISAM) */;
最大值
PARTITION BY RANGE (id)
(
PARTITION p0 VALUES LESS THAN (8),
PARTITION p1 VALUES LESS THAN MAXVALUE)
適用場景:
這樣就表示,所有 id 大于 7 的數(shù)據(jù)記錄存在在 p1 分區(qū)里。
RANGE分區(qū)在如下場合特別有用:
· 當(dāng)需要?jiǎng)h除“舊的”數(shù)據(jù)時(shí)。如果你使用上面最近的那個(gè)例子給出的分區(qū)方案,你只需簡單地使用 “ALTER TABLE employees DROP PARTITION p0;”來刪除所有在 1991 年前就已經(jīng)停止工作的雇員相對應(yīng)的所有行。對于有大量行的表,這比運(yùn)行一個(gè)如“DELETE FROM employees WHERE YEAR(separated) <=
1990;”這樣的一個(gè) DELETE 查詢要有效得多。
· 想要使用一個(gè)包含有日期或時(shí)間值,或包含有從一些其他級(jí)數(shù)開始增長的值的列。
· 經(jīng)常運(yùn)行直接依賴于用于分割表的列的查詢。例如,當(dāng)執(zhí)行一個(gè)如
“SELECT COUNT(*) FROM employees WHERE YEAR(separated) = 2000 GROUP BY store_id;”這樣的查詢時(shí),MySQL 可以很迅速地確定只有分區(qū) p2 需要掃描,這是因?yàn)橛嘞碌姆謪^(qū)不可能包含有符合該 WHERE 子句的任何記錄
LIST分區(qū)類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來進(jìn)行選擇。
DROP TABLE IF EXISTS `p_list`;
CREATE TABLE `p_list` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`typeid` mediumint(10) NOT NULL DEFAULT '0',
`typename` char(20) DEFAULT NULL,
PRIMARY KEY (`id`,`typeid`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY LIST (typeid)
(PARTITION p0 VALUES IN (1,2,3,4) ENGINE = MyISAM, PARTITION p1 VALUES IN (5,6,7,8) ENGINE = MyISAM) */;
HASH分區(qū) 基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū),該表達(dá)
式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含 MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。 HASH 分區(qū)主要用來確保數(shù)據(jù)在預(yù)先確定數(shù)目的分區(qū)中平均分布。在 RANGE 和 LIST 分區(qū)中,必須明確指定一個(gè)給定的列值或列值集合應(yīng)該保存在哪個(gè)分區(qū)中;而在 HASH 分區(qū)中,MySQL 自動(dòng)完成這些工作,你所要做的只是基于將要被哈希的列值指定一個(gè)列值或表達(dá)式,以及指定被分區(qū)的表將要被分割成的分區(qū)數(shù)量
DROP TABLE IF EXISTS `p_hash`;
CREATE TABLE `p_hash` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`storeid` mediumint(10) NOT NULL DEFAULT '0',
`storename` char(255) DEFAULT NULL,
PRIMARY KEY (`id`,`storeid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY HASH (storeid)
PARTITIONS 4 */;
簡單點(diǎn)說就是數(shù)據(jù)的存入可以按 partition by hash(expr); 這里的 expr 可以
是鍵名也可以是表達(dá)式比如 YEAR(time),如果是表達(dá)式的情況下
“但是應(yīng)當(dāng)記住,每當(dāng)插入或更新(或者可能刪除)一行,這個(gè)表達(dá)式都要計(jì)
算一次;這意味著非常復(fù)雜的表達(dá)式可能會(huì)引起性能問題,尤其是在執(zhí)行同時(shí)
影響大量行的運(yùn)算(例如批量插入)的時(shí)候。 ”
在執(zhí)行刪除、寫入、更新時(shí)這個(gè)表達(dá)式都會(huì)計(jì)算一次。
數(shù)據(jù)的分布采用基于用戶函數(shù)結(jié)果的模數(shù)來確定使用哪個(gè)編號(hào)的分區(qū)。換句話,對于一個(gè)表達(dá)式“expr”,將要保存記錄的分區(qū)編號(hào)為 N ,其中“N = MOD(expr, num)”。
比如上面的 storeid 為 10;那么 N=MOD(10,4) ;N 是等于 2 的,那么這條記錄就存儲(chǔ)在 p2 的分區(qū)里面。
如果插入一個(gè)表達(dá)式列值為'2005-09-15′的記錄到表中,那么保存該條記錄的分區(qū)確定如下:MOD(YEAR('2005-09-01′),4) = MOD(2005,4) = 1 ; 就存儲(chǔ)在 p1 分區(qū)里面了。
分區(qū)注意點(diǎn)
1、重新分區(qū)時(shí),如果原分區(qū)里面存在 maxvalue 則新的分區(qū)里面也必須包含
maxvalue否則就錯(cuò)誤。
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ū)刪除時(shí),數(shù)據(jù)也同樣會(huì)被刪除 alter table p_range drop partition p0;
3、如果 range 分區(qū)列表里面沒有 maxvalue 則如有新數(shù)據(jù)大于現(xiàn)在分區(qū) range 數(shù)據(jù)值那么這個(gè)數(shù)據(jù)是無法寫入到數(shù)據(jù)庫表的。
4、修改表名不需要 刪除分區(qū)后在進(jìn)行更改,修改表名后分區(qū)存儲(chǔ) myd myi 對應(yīng)也會(huì)自動(dòng)更改。
如果希望從所有分區(qū)刪除所有的數(shù)據(jù),但是又保留表的定義和表的分區(qū)模式,使用 TRUNCATE TABLE 命令。(請參見 13.2.9 節(jié),“TRUNCATE 語法”)。
如果希望改變表的分區(qū)而又不丟失數(shù)據(jù),使用“ALTER TABLE … REORGANIZE PARTITION”語句。參見下面的內(nèi)容,或者在 13.1.2 節(jié),“ALTER TABLE 語法” 中參考關(guān)于 REORGANIZE PARTITION 的信息。
5、對表進(jìn)行分區(qū)時(shí),不論采用哪種分區(qū)方式如果表中存在主鍵那么主鍵必須在分區(qū)列中。表分區(qū)的局限性。
6、list 方式分區(qū)沒有類似于 range 那種 less than maxvalue 的寫法,也就是說 list 分區(qū)表的所有數(shù)據(jù)都必須在分區(qū)字段的值列表集合中。
7、在 MySQL 5.1 版中,同一個(gè)分區(qū)表的所有分區(qū)必須使用同一個(gè)存儲(chǔ)引擎;例如,不能對一個(gè)分區(qū)使用 MyISAM,而對另一個(gè)使用 InnoDB。
8、分區(qū)的名字是不區(qū)分大小寫的,myp1 與 MYp1 是相同的。
對于以上關(guān)于mysql分區(qū)使用命令詳情,如果大家還有更多需要了解的可以持續(xù)關(guān)注我們創(chuàng)新互聯(lián)的行業(yè)推新,如需獲取專業(yè)解答,可在官網(wǎng)聯(lián)系售前售后的,希望該文章可給大家?guī)硪欢ǖ闹R(shí)更新。
文章名稱:mysql分區(qū)使用命令詳情
URL地址:http://chinadenli.net/article40/geheeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作、Google、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)