mysql hash分区 数目_mysql8 参考手册-HASH分区
分區(qū)依據(jù)HASH主要用于確保在預(yù)定數(shù)量的分區(qū)之間均勻分布數(shù)據(jù)。使用范圍或列表分區(qū)時(shí),必須明確指定應(yīng)將給定列值或一組列值存儲(chǔ)在哪個(gè)分區(qū)中;對(duì)于散列分區(qū),此決定將由您來(lái)決定,您只需要根據(jù)要散列的列值以及要將分區(qū)表劃分為的分區(qū)數(shù)來(lái)指定列值或表達(dá)式。
要使用分區(qū)對(duì)表進(jìn)行HASH分區(qū),有必要在CREATE TABLE語(yǔ)句后附加一個(gè)子句,其中 是一個(gè)返回整數(shù)的表達(dá)式。這可以只是列的名稱,該列的類型是MySQL的整數(shù)類型之一。此外,您很可能希望在后面加上,其中 是一個(gè)正整數(shù),代表該表將被劃分為的分區(qū)數(shù)。 PARTITION BY HASH (expr)exprPARTITIONS numnum
注意
為簡(jiǎn)單起見(jiàn),以下示例中的表不使用任何鍵。您應(yīng)該意識(shí)到,如果表具有任何唯一鍵,則該表的分區(qū)表達(dá)式中使用的每一列都必須是每個(gè)唯一鍵(包括主鍵)的一部分。有關(guān)更多信息,請(qǐng)參見(jiàn) 第23.6.1節(jié)“分區(qū)鍵,主鍵和唯一鍵”。
下面的語(yǔ)句創(chuàng)建一個(gè)在store_id列上使用哈希的表, 并分為4個(gè)分區(qū):
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;
如果不包含PARTITIONS子句,則分區(qū)數(shù)默認(rèn)為1; 使用PARTITIONS關(guān)鍵字后沒(méi)有數(shù)字的情況會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。
您還可以使用SQL表達(dá)式為返回整數(shù) expr。例如,您可能想根據(jù)雇用員工的年份進(jìn)行劃分。可以按如下所示完成:
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT,
store_id INT
)
PARTITION BY HASH( YEAR(hired) )
PARTITIONS 4;
expr必須返回一個(gè)非恒定,非隨機(jī)的整數(shù)值(換句話說(shuō),它應(yīng)該是可變的但是確定的),并且不得包含第23.6節(jié)“分區(qū)的限制和限制”中所述的任何禁止的構(gòu)造 。您還應(yīng)該記住,每次插入或更新(或可能刪除)一行時(shí),都會(huì)對(duì)該表達(dá)式求值;這意味著非常復(fù)雜的表達(dá)式可能會(huì)引起性能問(wèn)題,尤其是在執(zhí)行一次影響很多行的操作(例如批處理插入)時(shí)。
最有效的散列函數(shù)是對(duì)單個(gè)表列進(jìn)行操作的函數(shù),其值與列值一致地增加或減少,因?yàn)檫@允許對(duì)分區(qū)范圍進(jìn)行 “ 修剪 ”。也就是說(shuō),表達(dá)式隨著其所基于的列的值變化的越緊密,MySQL可以更有效地使用該表達(dá)式進(jìn)行哈希分區(qū)。
例如,where date_col是type的列DATE,則表示表達(dá)式 TO_DAYS(date_col)隨的值直接變化date_col,因?yàn)閷?duì)于的值的每次更改,date_col表達(dá)式的值都會(huì)以一致的方式更改。YEAR(date_col)相對(duì)于而言, 表達(dá)式的方差date_col并不像的方差 那么直接 TO_DAYS(date_col),因?yàn)椴⒎敲糠N可能的變化都會(huì)date_col產(chǎn)生的等效變化 YEAR(date_col)。即使這樣, YEAR(date_col)也很適合使用散列函數(shù),因?yàn)樗S的一部分直接變化,date_col并且在date_col導(dǎo)致比例變化很大 YEAR(date_col)。
相比之下,假設(shè)您有一個(gè)名為int_col類型 的列 INT。現(xiàn)在考慮表達(dá)式 POW(5-int_col,3) + 6。對(duì)于哈希函數(shù)而言,這將是一個(gè)糟糕的選擇,因?yàn)閕nt_col不能保證值的變化會(huì)導(dǎo)致表達(dá)式值的變化。將的值更改int_col給定的數(shù)量可能會(huì)導(dǎo)致表達(dá)式的值產(chǎn)生很大的不同。例如,改變int_col從 5對(duì)6產(chǎn)生的變化-1表達(dá)式的值,但改變的值int_col,從 6對(duì)7產(chǎn)生的變化-7 在表達(dá)式值中。
換句話說(shuō),列值與表達(dá)式的值的曲線越接近方程式所描繪的直線( 其中 某個(gè)非零常數(shù)),則表達(dá)式越適合哈希。這與以下事實(shí)有關(guān):表達(dá)式越非線性,它傾向于產(chǎn)生的分區(qū)之間的數(shù)據(jù)分布就越不均勻。 y=cxc
從理論上講,也可以對(duì)涉及多個(gè)列值的表達(dá)式進(jìn)行修剪,但是要確定哪種表達(dá)式合適則可能非常困難且耗時(shí)。因此,不特別推薦使用涉及多個(gè)列的哈希表達(dá)式。
當(dāng)PARTITION BY HASH被使用時(shí),存儲(chǔ)引擎確定哪個(gè)分區(qū) num分區(qū)使用基于表達(dá)式的結(jié)果的模量。換句話說(shuō),對(duì)于給定的表達(dá)式expr,存儲(chǔ)記錄的分區(qū)為分區(qū)編號(hào) N,其中 。假設(shè)該表 定義如下,因此它具有4個(gè)分區(qū): N = MOD(expr, num)t1
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
PARTITION BY HASH( YEAR(col3) )
PARTITIONS 4;
如果你插入一條記錄到t1它的 col3價(jià)值 '2005-09-15',那么它存儲(chǔ)在分區(qū)確定如下:
MOD(YEAR('2005-09-01'),4)
= MOD(2005,4)
= 1
MySQL 8.0還支持HASH稱為線性哈希的分區(qū) 變體,該變體 采用更復(fù)雜的算法來(lái)確定插入分區(qū)表中的新行的位置。有關(guān)此算法的說(shuō)明,請(qǐng)參見(jiàn) 第23.2.4.1節(jié)“線性哈希分區(qū)”。
每次插入或更新記錄時(shí),都會(huì)評(píng)估用戶提供的表達(dá)式。當(dāng)刪除記錄時(shí),還可以根據(jù)情況對(duì)它進(jìn)行評(píng)估。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql hash分区 数目_mysql8 参考手册-HASH分区的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中国新型地铁完成调试:最高时速120km
- 下一篇: mysql strcmp s1 s2_m