最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL分區(qū)之HASH分區(qū)詳解

 更新時間:2022年04月13日 10:50:07   作者:pursuer.chen  
hash分區(qū)的目的是將數(shù)據(jù)按照某列進行hash計算后更加均勻的分散到各個分區(qū),下面這篇文章主要給大家介紹了關(guān)于MySQL分區(qū)之HASH分區(qū)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

介紹

基于給定的分區(qū)個數(shù),將數(shù)據(jù)分配到不同的分區(qū),HASH分區(qū)只能針對整數(shù)進行HASH,對于非整形的字段只能通過表達式將其轉(zhuǎn)換成整數(shù)。表達式可以是mysql中任意有效的函數(shù)或者表達式,對于非整形的HASH往表插入數(shù)據(jù)的過程中會多一步表達式的計算操作,所以不建議使用復(fù)雜的表達式這樣會影響性能。

MYSQL支持兩種HASH分區(qū),常規(guī)HASH(HASH)和線性HASH(LINEAR HASH)。

一、常規(guī)HASH

常規(guī)hash是基于分區(qū)個數(shù)的取模(%)運算。根據(jù)余數(shù)插入到指定的分區(qū)

CREATE TABLE tbhash (
    id INT NOT NULL,
    store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4
;
ALTER TABLE tbhash ADD INDEX ix_store_id(store_id);
INSERT INTO tbhash() VALUES(1,100),(1,101),(2,102),(3,103),(4,104);

SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tbhash';

其中100,104對4取模是0所以這兩條數(shù)據(jù)被分配到了p0分區(qū)。

2.時間類型字段

CREATE TABLE employees (
    id INT NOT NULL,
    hired DATE NOT NULL DEFAULT '1970-01-01',
)
PARTITION BY HASH( YEAR(hired) )
PARTITIONS 4;

常規(guī)hash的分區(qū)非常的簡便,通過取模的方式可以讓數(shù)據(jù)非常平均的分布每一個分區(qū),但是由于分區(qū)在創(chuàng)建表的時候已經(jīng)固定了。如果新增或者收縮分區(qū)的數(shù)據(jù)遷移比較大。

二、線性HASH(LINEAR HASH)

LINEAR HASH和HASH的唯一區(qū)別就是PARTITION BY LINEAR HASH

CREATE TABLE tblinhash (
    id INT NOT NULL,
    hired DATE NOT NULL DEFAULT '1970-01-01'
)
PARTITION BY LINEAR HASH( YEAR(hired) )
PARTITIONS 6;

線性HASH的計算原理如下:

假設(shè)分區(qū)個數(shù)num=6,N表示數(shù)據(jù)最終存儲的分區(qū)

sep1:V = POWER(2, CEILING(LOG(2, num))),LOG()是計算NUM以2為底的對數(shù),CEILING()是向上取整,POWER()是取2的次方值;如果num的值是2的倍數(shù)那么這個表達式計算出來的結(jié)果不變。

V=POWER(2,CEILING(LOG(2,6)))

V=POWER(2,3)

V=8

sep2:N=values&(V-1);&位與運算,將兩個值都轉(zhuǎn)換成2進行求與運算,當都為1才為1;當num是2的倍數(shù)時由于V計算出來的結(jié)果不變,這時values&(V-1)=MOD(values/num)和時間HASH取模算出的結(jié)果是一致的,這時特殊情況只有當分區(qū)是2的倍數(shù)才是這種 情況。values是YEAR(hired)的值

sep3:while N>=num

sep3-1:N=N& (CEIL(V/ 2)- 1)

例如:

1.當插入的值是'2003-04-14'時

    V = POWER(2, CEILING( LOG(2,6) )) = 8

N = YEAR('2003-04-14') & (8 - 1)

= 2003 & 7

=3

(3 >= 6 is FALSE: record stored in partition #3),N不大于num所以存儲在第3分區(qū),注意這里的3指的是P3,分區(qū)號是從P0開始。

2.當插入的值是‘1998-10-19’

V = POWER(2, CEILING( LOG(2,6) )) = 8

N = YEAR('1998-10-19') & (8-1)

= 1998 & 7

= 6

(6 >= 6 is TRUE: additional step required),由于N>=num所以要進行第三步操作

N=N&(CEILING(8/2)-1)

=6&3

=2

(2>=6is FALSE:recored in partition #2),由于2不大于6所以存儲在第2個分區(qū),注意這里的3指的是P2,分區(qū)號是從P0開始。

INSERT INTO tblinhash() VALUES(1,'2003-04-14'),(2,'1998-10-19');
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblinhash';

EXPLAIN SELECT * FROM tblinhash WHERE hired='2003-04-14';

三、分區(qū)管理

常規(guī)HASH和線性HASH的增加收縮分區(qū)的原理是一樣的。增加和收縮分區(qū)后原來的數(shù)據(jù)會根據(jù)現(xiàn)有的分區(qū)數(shù)量重新分布。HASH分區(qū)不能刪除分區(qū),所以不能使用DROP PARTITION操作進行分區(qū)刪除操作;

只能通過ALTER TABLE ... COALESCE PARTITION num來合并分區(qū),這里的num是減去的分區(qū)數(shù)量;

可以通過ALTER TABLE ... ADD PARTITION PARTITIONS num來增加分區(qū),這里是null是在原先基礎(chǔ)上再增加的分區(qū)數(shù)量。

1.合并分區(qū)

減去3個分區(qū)

ALTER TABLE tblinhash COALESCE PARTITION 3;
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblinhash';

注意:減去兩個分區(qū)后,數(shù)據(jù)根據(jù)現(xiàn)有的分區(qū)進行了重新的分布,以'2003-04-14'為例:POWER(2, CEILING( LOG(2,3) ))=4,2003&(4-1)=3,3>=3,3&(CEILING(3/2)-1)=1,所以現(xiàn)在的'2003-04-14'這條記錄由原來的p3變成了p1

2.增加分區(qū)

增加4個分區(qū)

ALTER TABLE tblinhash add PARTITION partitions 4;
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='tblinhash';

當在3個分區(qū)的基礎(chǔ)上增加4個分區(qū)后,‘2003-04-14’由原來的p1變成了p3,而另一條記錄由原來的p2變成了p6

四、移除表的分區(qū)

ALTER TABLE tablename
REMOVE PARTITIONING ;

注意:使用remove移除分區(qū)是僅僅移除分區(qū)的定義,并不會刪除數(shù)據(jù)和drop PARTITION不一樣,后者會連同數(shù)據(jù)一起刪除

分區(qū)系列文章:

RANGE分區(qū):http://www.fzitv.net/article/244269.htm

COLUMN分區(qū):http://www.fzitv.net/article/96515.htm

LIST分區(qū):http://www.fzitv.net/article/244256.htm

HASH分區(qū):http://www.fzitv.net/article/244277.htm

KEY分區(qū):http://www.fzitv.net/article/244282.htm

子分區(qū):http://www.fzitv.net/article/244294.htm

指定各分區(qū)路徑:http://www.fzitv.net/article/244296.htm

分區(qū)索引以及分區(qū)介紹總結(jié):http://www.fzitv.net/article/244300.htm

總結(jié)

常規(guī)HASH的數(shù)據(jù)分布更加均勻一些,也便于理解;目前還沒有徹底理解為什么線性HASH在收縮和增加分區(qū)時處理的速度會更快,同時線性HASH的數(shù)據(jù)分布不均勻。

到此這篇關(guān)于MySQL分區(qū)之HASH分區(qū)的文章就介紹到這了,更多相關(guān)MySQL HASH分區(qū)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義

    詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義

    關(guān)于MySQL數(shù)據(jù)類型decimal中n和m分別表示什么含義?本文就此問題作了簡單論述,并創(chuàng)建相關(guān)表進行驗證,需要的朋友可以了解下。
    2017-10-10
  • mysql中關(guān)鍵詞exists的用法實例詳解

    mysql中關(guān)鍵詞exists的用法實例詳解

    在mysql中exists用于檢查子查詢是否至少會返回一行數(shù)據(jù),該子查詢實際上并不返回任何數(shù)據(jù),而是返回true或false,下面這篇文章主要給大家介紹了關(guān)于mysql中關(guān)鍵詞exists用法的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Ubuntu安裝Mysql+啟用遠程連接的完整過程

    Ubuntu安裝Mysql+啟用遠程連接的完整過程

    這篇文章主要介紹了Ubuntu如何安裝Mysql+啟用遠程連接,用ssh客戶端或者云服務(wù)器廠家提供的網(wǎng)頁版控制臺都行,只要你能連上服務(wù)器就行,需要的朋友可以參考下
    2022-06-06
  • Mysql 5.7.20壓縮版下載和安裝簡易教程

    Mysql 5.7.20壓縮版下載和安裝簡易教程

    這篇文章主要介紹了Mysql 5.7.20壓縮版下載和安裝簡易教程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • 在idea中使用mysql數(shù)據(jù)庫超詳細教程

    在idea中使用mysql數(shù)據(jù)庫超詳細教程

    這篇文章主要介紹了如何在IntelliJ IDEA中連接MySQL數(shù)據(jù)庫,并使用控制臺執(zhí)行SQL語句,還詳細講解了如何使用MyBatis Generator快速生成實體類、接口和SQL文件,以及如何解決Lombok依賴問題,需要的朋友可以參考下
    2025-02-02
  • 安裝SQL server出現(xiàn)“服務(wù)沒有及時響應(yīng)啟動或控制請求”的解決方案

    安裝SQL server出現(xiàn)“服務(wù)沒有及時響應(yīng)啟動或控制請求”的解決方案

    這篇文章主要給大家解決了安裝SQL server出現(xiàn)“服務(wù)沒有及時響應(yīng)啟動或控制請求”,文中有詳細的解決方案,有需要的同學(xué)可以參考閱讀下
    2023-08-08
  • Mysql如何查詢近30天活躍用戶數(shù)

    Mysql如何查詢近30天活躍用戶數(shù)

    這篇文章主要介紹了Mysql查詢近30天活躍用戶數(shù),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • MySQL刪除表數(shù)據(jù)與MySQL清空表命令的3種方法淺析

    MySQL刪除表數(shù)據(jù)與MySQL清空表命令的3種方法淺析

    刪除現(xiàn)有MySQL表非常容易,但是刪除任何現(xiàn)有的表時要非常小心,因為刪除表后丟失的數(shù)據(jù)將無法恢復(fù),下面這篇文章主要給大家介紹了關(guān)于MySQL刪除表數(shù)據(jù)與MySQL清空表命令的3種方法的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • MySql中深度分頁的問題處理

    MySql中深度分頁的問題處理

    這篇文章主要介紹了MySql中深度分頁的問題處理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • mysql字符串拼接的幾種實用方式小結(jié)

    mysql字符串拼接的幾種實用方式小結(jié)

    在SQL語句中經(jīng)常需要進行字符串拼接,下面這篇文章主要給大家介紹了關(guān)于mysql字符串拼接的幾種實用方式,文中通過圖文以及代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-11-11

最新評論

万全县| 酒泉市| 天气| 左权县| 疏附县| 景东| 尼勒克县| 石景山区| 连平县| 云阳县| 怀宁县| 绥江县| 嘉兴市| 大关县| 南靖县| 富民县| 永顺县| 岗巴县| 红安县| 乌兰察布市| 合肥市| 东丽区| 克东县| 涟源市| 彰武县| 怀宁县| 栾川县| 宜兰县| 桦川县| 安徽省| 肥西县| 郑州市| 紫云| 漳浦县| 方城县| 洞口县| 阳朔县| 平谷区| 专栏| 岗巴县| 渝北区|