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