示例講解PostgreSQL表分區(qū)的三種方式

我最新最全的文章都在 南瓜慢說(shuō) www.pkslow.com ,歡迎大家來(lái)喝茶囚巴!

1 簡(jiǎn)介

表分區(qū)是解決一些因單表過(guò)大引用的性能問(wèn)題的方式原在,比如某張表過(guò)大就會(huì)造成查詢變慢,可能分區(qū)是一種解決方案彤叉。一般建議當(dāng)單表大小超過(guò)內(nèi)存就可以考慮表分區(qū)了庶柿。PostgreSQL的表分區(qū)有三種方式:

  • Range:范圍分區(qū);
  • List:列表分區(qū)秽浇;
  • Hash:哈希分區(qū)浮庐。

本文通過(guò)示例講解如何進(jìn)行這三種方式的分區(qū)。

2 例講三種方式

為方便柬焕,我們通過(guò)Docker的方式啟動(dòng)一個(gè)PostgreSQL审残,可參考:《Docker啟動(dòng)PostgreSQL并推薦幾款連接工具》。我們要選擇較高的版本斑举,否則不支持Hash分區(qū)搅轿,命令如下:

docker run -itd \
    --name pkslow-postgres \
    -e POSTGRES_DB=pkslow \
    -e POSTGRES_USER=pkslow \
    -e POSTGRES_PASSWORD=pkslow \
    -p 5432:5432 \
    postgres:13

2.1 Range范圍分區(qū)

先創(chuàng)建一張表帶有年齡,然后我們根據(jù)年齡分段來(lái)進(jìn)行分區(qū)富玷,創(chuàng)建表語(yǔ)句如下:

CREATE TABLE pkslow_person_r (
    age int not null,
    city varchar not null
) PARTITION BY RANGE (age);

這個(gè)語(yǔ)句已經(jīng)指定了按age字段來(lái)分區(qū)了璧坟,接著創(chuàng)建分區(qū)表:

create table pkslow_person_r1 partition of pkslow_person_r for values from (MINVALUE) to (10);
create table pkslow_person_r2 partition of pkslow_person_r for values from (11) to (20);
create table pkslow_person_r3 partition of pkslow_person_r for values from (21) to (30);
create table pkslow_person_r4 partition of pkslow_person_r for values from (31) to (MAXVALUE);

這里創(chuàng)建了四張分區(qū)表,分別對(duì)應(yīng)年齡是0到10歲赎懦、11到20歲沸柔、21到30歲、30歲以上铲敛。

接著我們插入一些數(shù)據(jù):

insert into pkslow_person_r(age, city) VALUES (1, 'GZ');
insert into pkslow_person_r(age, city) VALUES (2, 'SZ');
insert into pkslow_person_r(age, city) VALUES (21, 'SZ');
insert into pkslow_person_r(age, city) VALUES (13, 'BJ');
insert into pkslow_person_r(age, city) VALUES (43, 'SH');
insert into pkslow_person_r(age, city) VALUES (28, 'HK');

可以看到這里的表名還是pkslow_person_r,而不是具體的分區(qū)表会钝,說(shuō)明對(duì)于客戶端是無(wú)感知的伐蒋。

我們查詢也一樣的:

但實(shí)際上是有分區(qū)表存在的:

而且分區(qū)表與主表的字段是一致的。

查詢分區(qū)表迁酸,就只能查到那個(gè)特定分區(qū)的數(shù)據(jù)了:

2.2 List列表分區(qū)

類似的先鱼,列表分區(qū)是按特定的值來(lái)分區(qū),比較某個(gè)城市的數(shù)據(jù)放在一個(gè)分區(qū)里奸鬓。這里不再給出每一步的講解焙畔,代碼如下:

-- 創(chuàng)建主表
create table pkslow_person_l (
                          age int not null,
                          city varchar not null
) partition by list (city);

-- 創(chuàng)建分區(qū)表
CREATE TABLE pkslow_person_l1 PARTITION OF pkslow_person_l FOR VALUES IN ('GZ');
CREATE TABLE pkslow_person_l2 PARTITION OF pkslow_person_l FOR VALUES IN ('BJ');
CREATE TABLE pkslow_person_l3 PARTITION OF pkslow_person_l DEFAULT;

-- 插入測(cè)試數(shù)據(jù)
insert into pkslow_person_l(age, city) VALUES (1, 'GZ');
insert into pkslow_person_l(age, city) VALUES (2, 'SZ');
insert into pkslow_person_l(age, city) VALUES (21, 'SZ');
insert into pkslow_person_l(age, city) VALUES (13, 'BJ');
insert into pkslow_person_l(age, city) VALUES (43, 'SH');
insert into pkslow_person_l(age, city) VALUES (28, 'HK');
insert into pkslow_person_l(age, city) VALUES (28, 'GZ');

當(dāng)我們查詢第一個(gè)分區(qū)的時(shí)候,只有廣州的數(shù)據(jù):

2.3 Hash哈希分區(qū)

哈希分區(qū)是指按字段取哈希值后再分區(qū)串远。具體的語(yǔ)句如下:

-- 創(chuàng)建主表
create table pkslow_person_h (
                          age int not null,
                          city varchar not null
) partition by hash (city);

-- 創(chuàng)建分區(qū)表
create table pkslow_person_h1 partition of pkslow_person_h for values with (modulus 4, remainder 0);
create table pkslow_person_h2 partition of pkslow_person_h for values with (modulus 4, remainder 1);
create table pkslow_person_h3 partition of pkslow_person_h for values with (modulus 4, remainder 2);
create table pkslow_person_h4 partition of pkslow_person_h for values with (modulus 4, remainder 3);

-- 插入測(cè)試數(shù)據(jù)
insert into pkslow_person_h(age, city) VALUES (1, 'GZ');
insert into pkslow_person_h(age, city) VALUES (2, 'SZ');
insert into pkslow_person_h(age, city) VALUES (21, 'SZ');
insert into pkslow_person_h(age, city) VALUES (13, 'BJ');
insert into pkslow_person_h(age, city) VALUES (43, 'SH');
insert into pkslow_person_h(age, city) VALUES (28, 'HK');

可以看到創(chuàng)建分區(qū)表的時(shí)候宏多,我們用了取模的方式儿惫,所以如果要?jiǎng)?chuàng)建N個(gè)分區(qū)表,就要取N取模伸但。

隨便查詢一張分區(qū)表如下:

可以看到同是SZ的哈希值是一樣的肾请,肯定會(huì)分在同一個(gè)分區(qū),而B(niǎo)J的哈希值取模后也屬于同一個(gè)分區(qū)更胖。

3 總結(jié)

本文講解了PostgreSQL分區(qū)的三種方式铛铁。

代碼請(qǐng)查看:https://github.com/LarryDpk/pkslow-samples

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市却妨,隨后出現(xiàn)的幾起案子饵逐,更是在濱河造成了極大的恐慌,老刑警劉巖彪标,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倍权,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捐下,警方通過(guò)查閱死者的電腦和手機(jī)账锹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坷襟,“玉大人奸柬,你說(shuō)我怎么就攤上這事∮こ蹋” “怎么了廓奕?”我有些...
    開(kāi)封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)档叔。 經(jīng)常有香客問(wèn)我桌粉,道長(zhǎng),這世上最難降的妖魔是什么衙四? 我笑而不...
    開(kāi)封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任铃肯,我火速辦了婚禮,結(jié)果婚禮上传蹈,老公的妹妹穿的比我還像新娘押逼。我一直安慰自己,他們只是感情好惦界,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布挑格。 她就那樣靜靜地躺著,像睡著了一般沾歪。 火紅的嫁衣襯著肌膚如雪漂彤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音挫望,去河邊找鬼立润。 笑死,一個(gè)胖子當(dāng)著我的面吹牛士骤,可吹牛的內(nèi)容都是我干的范删。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拷肌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼到旦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起巨缘,我...
    開(kāi)封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤添忘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后若锁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體搁骑,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年又固,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仲器。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仰冠,死狀恐怖乏冀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洋只,我是刑警寧澤辆沦,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站识虚,受9級(jí)特大地震影響肢扯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜担锤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一蔚晨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肛循,春花似錦蛛株、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)欢摄。三九已至熬丧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怀挠,已是汗流浹背析蝴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工害捕, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷畸。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓尝盼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親佑菩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盾沫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容