欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談PostgreSQL表分區(qū)的三種方式

 更新時(shí)間:2021年06月29日 10:31:23   作者:南瓜慢說  
隨著使用時(shí)間的增加,數(shù)據(jù)庫中的數(shù)據(jù)量也不斷增加,因此數(shù)據(jù)庫查詢?cè)絹碓铰?。加速?shù)據(jù)庫的方法很多,如添加特定的索引,將日志目錄換到單獨(dú)的磁盤分區(qū),調(diào)整數(shù)據(jù)庫引擎的參數(shù)等。本文即將介紹的數(shù)據(jù)庫表分區(qū)即能達(dá)到此效果

一、簡介

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

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

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

二、三種方式

為方便,我們通過Docker的方式啟動(dòng)一個(gè)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ù)年齡分段來進(jìn)行分區(qū),創(chuàng)建表語句如下:

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

這個(gè)語句已經(jīng)指定了按age字段來分區(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ū)表,說明對(duì)于客戶端是無感知的。

我們查詢也一樣的:

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

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

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

2.2、List列表分區(qū)

類似的,列表分區(qū)是按特定的值來分區(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;

-- 插入測試數(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ū)。具體的語句如下:

-- 創(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);

-- 插入測試數(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ū),而BJ的哈希值取模后也屬于同一個(gè)分區(qū)。

三、總結(jié)

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

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

以上就是淺談PostgreSQL表分區(qū)的三種方式的詳細(xì)內(nèi)容,更多關(guān)于PostgreSQL表分區(qū)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PostgreSQL教程(四):數(shù)據(jù)類型詳解

    PostgreSQL教程(四):數(shù)據(jù)類型詳解

    這篇文章主要介紹了PostgreSQL教程(四):數(shù)據(jù)類型詳解,本文講解了數(shù)值類型、字符類型、布爾類型、位串類型、數(shù)組、復(fù)合類型等數(shù)據(jù)類型,需要的朋友可以參考下
    2015-05-05
  • PostgreSQL之分區(qū)表(partitioning)

    PostgreSQL之分區(qū)表(partitioning)

    通過合理的設(shè)計(jì),可以將選擇一定的規(guī)則,將大表切分多個(gè)不重不漏的子表,這就是傳說中的partitioning。比如,我們可以按時(shí)間切分,每天一張子表,比如我們可以按照某其他字段分割,總之了就是化整為零,提高查詢的效能
    2016-11-11
  • postgresql 賦權(quán)語句 grant的正確使用說明

    postgresql 賦權(quán)語句 grant的正確使用說明

    這篇文章主要介紹了postgresql 賦權(quán)語句 grant的正確使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL12.5中分區(qū)表的一些操作實(shí)例

    PostgreSQL12.5中分區(qū)表的一些操作實(shí)例

    PostgreSQL支持通過表繼承進(jìn)行分區(qū),下面這篇文章主要給大家介紹了關(guān)于PostgreSQL12.5中分區(qū)表的一些操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 使用Postgresql 實(shí)現(xiàn)快速插入測試數(shù)據(jù)

    使用Postgresql 實(shí)現(xiàn)快速插入測試數(shù)據(jù)

    這篇文章主要介紹了使用Postgresql 實(shí)現(xiàn)快速插入測試數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL中insert_username的擴(kuò)展使用

    PostgreSQL中insert_username的擴(kuò)展使用

    insert_username?是 PostgreSQL 的一個(gè)實(shí)用擴(kuò)展,用于自動(dòng)記錄數(shù)據(jù)行的創(chuàng)建者和最后修改者信息,本文就來詳細(xì)的介紹一下insert_username擴(kuò)展,感興趣的可以了解一下
    2025-06-06
  • Postgresql分布式插件plproxy的使用詳解

    Postgresql分布式插件plproxy的使用詳解

    這篇文章主要介紹了Postgresql分布式插件plproxy的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作

    postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作

    這篇文章主要介紹了postgresql 查詢集合結(jié)果用逗號(hào)分隔返回字符串處理的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • postgres之jsonb屬性的使用操作

    postgres之jsonb屬性的使用操作

    這篇文章主要介紹了postgres之jsonb屬性的使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • PostgreSQL 如何修改文本類型字段的存儲(chǔ)方式

    PostgreSQL 如何修改文本類型字段的存儲(chǔ)方式

    這篇文章主要介紹了PostgreSQL 如何修改文本類型字段的存儲(chǔ)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評(píng)論