今天來給你們講解下postgresql數據庫的商業中間件pgoneproxy支持範圍分表的問題。這種分表的方式在不少場景中會被使用到。好比在電商,電信等行業,須要把每月的數據存放到不一樣的月份,就可使用range這個功能。sql
先看看針對一級分表的狀況下的配置狀況:數據庫
[ { "table":"trange", "pkey" : "id", "type" : "int", "method": "range", "partitions": [ {"suffix":"_100", "value": "100", "group":"data1"}, {"suffix":"_1000", "value":"1000", "group":"data1"} ] } ]
上面配置的含義是:id<100的存放到trange_100這張表中,id >=100而且id < 1000的數據存放到trange_1000的表中。post
若是須要根據時間來配置範圍,則須要修改type爲timestamp。再修改value爲對應的時間便可。網站
在不少場景中須要二級分表,好比在電商行業中,須要把用戶編號爲0結尾的用戶在7月份產生的訂單放到以_0_201607結尾的表中。下面講解的例子沒有以這種場景來說解,舉了用戶註冊信息的例子,一樣按照用戶編號和年份分割。配置以下所示:postgresql
[ { "table" :"bigrange", "pkey" : "id", "type" : "int", "method" : "crc32", "partitions" : [ {"suffix":"_0", "group":"data1"}, {"suffix":"_1", "group":"data1"} ], "subpkey":"tt", "subtype":"timestamp", "submethod":"range", "subpartitions": [ {"suffix":"_2015", "value":"2015-01-01 00:00:00"}, {"suffix":"_2016", "value":"2016-01-01 00:00:01"} ] } ]
經過上面的配置來建立bigrange 表,則能夠獲得以下所示的表:code
pgbench=> \dt; List of relations Schema | Name | Type | Owner --------+------------------+-------+---------- public | bigrange_0_2015 | table | db_user public | bigrange_0_2016 | table | db_user public | bigrange_1_2015 | table | db_user public | bigrange_1_2016 | table | db_user
根據配置是須要把在2015-01-01 00:00:00之前的用戶放到bigrange_0_2015或者bigrang_1_2015的兩張表中。在2015-01-01 00:00:01~2016-01-01 00:00:01註冊的用戶存放到bigrange_0_2016, bigrange_1_2016的兩張表中。中間件
下面是簡單的操做bigrange表的狀況:it
pgbench=> create table bigrange(id int, name varchar(32), age int, tt timestamp); CREATE 0 pgbench=> insert into bigrange(id, name, age, tt) values(0, 'name0', 100, '2013-01-01 00:00:01'); INSERT 0 1 pgbench=> insert into bigrange(id, name, age, tt) values(1, 'name1', 100, '2014-01-01 00:00:01'); INSERT 0 1 pgbench=> insert into bigrange(id, name, age, tt) values(2, 'name2', 102, '2015-01-01 00:00:00'); INSERT 0 1 pgbench=> insert into bigrange(id, name, age, tt) values(3, 'name3', 103, '2016-01-01 00:00:00'); INSERT 0 1 pgbench=> insert into bigrange(id, name, age, tt) values(4, 'name4', 104, '2017-01-01 00:00:00'); ERROR: Partitioned tables should choose at least one partition! pgbench=> insert into bigrange(id, name, age, tt) values(4, 'name4', 104, '2015-01-01 03:00:00'); INSERT 0 1 pgbench=> select * from bigrang_0_2015; ERROR: relation "bigrang_0_2015" does not exist LINE 1: select * from bigrang_0_2015; ^ pgbench=> \dt; List of relations Schema | Name | Type | Owner --------+------------------+-------+---------- public | bigrange_0_2015 | table | db_user public | bigrange_0_2016 | table | db_user public | bigrange_1_2015 | table | db_user public | bigrange_1_2016 | table | db_user (4 rows) pgbench=> select * from bigrange_0_2015; id | name | age | tt ----+-------+-----+--------------------- 0 | name0 | 100 | 2013-01-01 00:00:01 (1 row) pgbench=> select * from bigrange_1_2015; id | name | age | tt ----+-------+-----+--------------------- 1 | name1 | 100 | 2014-01-01 00:00:01 (1 row) pgbench=> select * from bigrange_0_2016; id | name | age | tt ----+-------+-----+--------------------- 2 | name2 | 102 | 2015-01-01 00:00:00 4 | name4 | 104 | 2015-01-01 03:00:00 (2 rows) pgbench=> select * from bigrange_1_2016; id | name | age | tt ----+-------+-----+--------------------- 3 | name3 | 103 | 2016-01-01 00:00:00 (1 row)
更多請訪問平民軟件的官方網站。io