面試問題:
1)什么場景,應(yīng)該用什么分區(qū)策略涯鲁?
2)怎么選擇分區(qū)字段和相關(guān)算法?
3)怎么解決不均勻和擴(kuò)容問題有序?
跨磁盤分散查詢抹腿,更大查詢吞吐量。
如SUM()和COUNT()聚合函數(shù)查詢旭寿,容易并行處理警绩。 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”盅称。查詢可在每個分區(qū)上同時進(jìn)行肩祥,總計所有分區(qū)得結(jié)果。
分區(qū)類型:RANGE缩膝、LIST混狠、HASH、KEY
一疾层、RANGE分區(qū)
基于屬于一個給定連續(xù)區(qū)間列值将饺,多行分配給分區(qū)。
區(qū)間要連續(xù)且不重疊痛黎,用VALUES LESS THAN操作符定義予弧。實例:
1到5雇員P0中,6到10在P1中湖饱,PARTITION BY RANGE 語法要求桌肴;按順序定義,從低到高琉历。(72, ‘Michael’, ‘Widenius’, ’1998-06-25′, NULL, 13)新行插入到p2坠七,
增加21商店錯誤。 CREATE TABLE用“catchall” VALUES LESS THAN子句旗笔,提供給大于明確指定最高值:MAXVALUE最大可能整數(shù)值
基于雇員的工作代碼分表彪置,job_code 列值的連續(xù)區(qū)間。2位數(shù)字:普通工人蝇恶,3數(shù)字:辦公室和支持人員拳魁,4數(shù)字:管理層
基于每個雇員離開公司的年份來分割表,YEAR(separated)
1991年前雇傭p0中撮弧,1991到1995年p1中潘懊, 1996到2000年p2中姚糊,2000年后p3中。
適用場景:
1)刪除一個分區(qū)上的“舊的”數(shù)據(jù)時,只刪除分區(qū)即可授舟。DELETE FROM employees WHERE YEAR (separated) <= 1990
2)包含有日期或時間值救恨,包含有從一些其他級數(shù)開始增長的值的列。
3)經(jīng)常運行直接依賴于用于分割表的列的查詢释树。如”SELECT COUNT(*) FROM employees WHERE YEAR(separated) = 2000 GROUP BY store_id;”迅速地確定只有分區(qū)p2掃描
二肠槽、LIST分區(qū)
類RANGE分區(qū),基于列值匹配一個離散值集合中的某個值
(1)“PARTITION BY LIST(expr)”來實現(xiàn)奢啥,其中“expr”是某列值或一個基于某個列值秸仙、并返回整數(shù)值的表達(dá)式,VALUES IN (value_list)定義分區(qū)桩盲,value_list逗號分隔整數(shù)列表寂纪。
(2)?西區(qū)的所有音像店都賣了:“ALTER TABLE employees DROP PARTITION pWest;”比相同作用DELETE(刪除)查詢“DELETE query DELETE FROM employees WHERE store_id IN (4,12,13,14,18)赌结;”有效得多弊攘。
(3) LIST沒有“VALUES LESS?THAN MAXVALUE”要匹配的任何值都必須在值列表中找到。
INSERT INTO employees VALUES(224, 'Linus', 'Torvalds', '2002-05-01', '2004-10-12', 42, 21);“store_id”列值21不能在用于定義分區(qū)pNorth, pEast, pWest,或pCentral的值列表中找到姑曙。
(4)??與其他三種生成復(fù)合的子分區(qū)
三襟交、HASH分區(qū)
“PARTITION BY HASH (expr)”,“expr”返回一個整數(shù)表達(dá)式伤靠。很可能需要再添加“PARTITIONS num”子句捣域,num是非負(fù)整數(shù),表示要被分割成分區(qū)數(shù)量
沒有PARTITIONS子句宴合,分區(qū)默認(rèn)為1焕梅。NDB Cluster(簇)表,默認(rèn)分區(qū)數(shù)將與簇數(shù)據(jù)節(jié)點數(shù)量相同卦洽,這種修正可能是考慮任何MAX_ROWS設(shè)置贞言,確保所有的行都能合適地插入分區(qū)中。
用HASH函數(shù)對createtime日期進(jìn)行HASH運算阀蒂,根據(jù)日期來分區(qū)數(shù)據(jù)该窗,10個分區(qū)。
LINER HASH
支持線性哈希功能蚤霞,與常規(guī)區(qū)別酗失,用線性2冪(powers-of-two)運算法則,常規(guī)哈希用模數(shù)昧绣。語法上區(qū)別“PARTITION BY”子句中添加“LINEAR”關(guān)鍵字规肴。
表達(dá)式expr,保存到分區(qū)num 個分區(qū)中的分區(qū)N,其中N是根據(jù)下面的算法得到:?
1. 大于num拖刃、2的冪删壮,稱為V?
2. V = POWER(2, CEILING(LOG(2, num))) (如,假定num是13兑牡。LOG(2,13)就是3.7004397181411央碟。 CEILING(3.7004397181411)就是4,則V = POWER(2,4), 即等于16)发绢。?
3. 設(shè)置 N = F(column_list) & (V – 1).?
4.??? 當(dāng) N >= num: · ?設(shè)置 V = CEIL(V / 2) · ?設(shè)置 N = N & (V – 1)?
例如,假設(shè)表t1垄琐,使用線性哈希分區(qū)且有4個分區(qū)边酒,是通過下面的語句創(chuàng)建的: CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR HASH( YEAR(col3) ) PARTITIONS 6; 現(xiàn)在假設(shè)要插入兩行記錄到表t1中,其中一條記錄col3列值為’2003-04-14′狸窘,另一條記錄col3列值為’1998-10-19′墩朦。第一條記錄將要保存到的分區(qū)確定如下: V = POWER(2, CEILING(LOG(2,7))) = 8 N = YEAR(’2003-04-14′) & (8 – 1) ?? = 2003 & 7 ?? = 3 (3 >= 6 為假(FALSE): 記錄將被保存到#3號分區(qū)中) 第二條記錄將要保存到的分區(qū)序號計算如下: V = 8 N = YEAR(’1998-10-19′) & (8-1) ? = 1998 & 7 ? = 6 (6 >= 4 為真(TRUE): 還需要附加的步驟) N = 6 & CEILING(5 / 2) ? = 6 & 3 ? = 2 ? (2 >= 4 為假(FALSE): 記錄將被保存到#2分區(qū)中) 按照線性哈希分區(qū)的優(yōu)點在于增加、刪除翻擒、合并和拆分分區(qū)將變得更加快捷氓涣,有利于處理含有極其大量(1000吉)數(shù)據(jù)的表。
缺點:分布不均衡陋气。
四劳吠、KEY分區(qū)
用的少,知道怎么用即可巩趁。
類似HASH分區(qū)痒玩,區(qū)別:KEY分區(qū)只支持計算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)议慰。必須有一列或多列包含整數(shù)值蠢古。
KEY分區(qū)中使用關(guān)鍵字LINEAR和在HASH分區(qū)中使用具有同樣作用,分區(qū)編號是通過2的冪(powers-of-two)算法得到别凹,不是通過模數(shù)算法草讶。