1介绍表分区是解决一些单表引用过大的性能问题的方法。例如,如果表太大,查询就会变慢。也许分区是一个解决方案。一般建议当单表超过内存时,可以考虑分表。PostgreSQL表分区的三种方式:Range:范围分区;List:列表分区;Hash:散列分区。本文通过实例来说明如何进行这三种分区方法。2三种方法举例为了方便起见,我们通过Docker启动一个PostgreSQL,参考:《Docker启动PostgreSQL并推荐几款连接工具》。我们需要选择更高的版本,否则不支持Hash分区,命令如下:dockerrun-itd\--namepkslow-postgres\-ePOSTGRES_DB=pkslow\-ePOSTGRES_USER=pkslow\-ePOSTGRES_PASSWORD=pkslow\-p5432:5432\postgres:132.1Range范围分区首先创建一张有age的表,然后我们按照age段进行分区。建表语句如下:CREATETABLEpkslow_person_r(ageintnotnull,cityvarcharnotnull)PARTITIONBYRANGE(age);thisstatementhasspecifiedtheagefieldtopartition,接着创建分区表:createtablepkslow_person_r1partitionofpkslow_person_rforvaluesfrom(MINVALUE)to(10);createtablepkslow_person_r2partitionofpkslow_person_rforvaluesfrom(11)to(20);createtablepkslow_person_r3partitionofpkslow_person_rforvaluesfrom(21)to(30);createtablepkslow_person_r4partitionofpkslow_person_rforvaluesfrom(31)to(MAXVALUE);这里创建了四张分区表,分别对应年龄段为0-10岁、11-20岁、21-30岁、30岁以上。然后我们插入一些数据:insertintopkslow_person_r(age,city)VALUES(1,'GZ');insertintopkslow_person_r(age,city)VALUES(2,'SZ');insertintopkslow_person_r(age,city)VALUES(21,'SZ');insertintopkslow_person_r(age,city)VALUES(13,'BJ');insertintopkslow_person_r(age,city)VALUES(43,'SH');insertintopkslow_person_r(age,city)VALUES(28,'HK');可以看到这里的表名还是pkslow_person_r,不是具体的分区表,说明对客户端不敏感。我们的查询是一样的:但实际上是有分区表的:而且分区表和主表的字段是一致的。如果查询分区表,只能查到那个特定分区的数据:2.2List列表分区类似,list分区是按照特定的值进行分区,在一个分区中比较某个城市的数据。这里不再给出每一步的讲解,代码如下:--创建主表createtablepkslow_person_l(ageintnotnull,cityvarcharnotnull)partitionbylist(city);--创建分区表CREATETABLEpkslow_person_l1PARTITIONOFpkslow_person_lFORVALUESIN('GZ');CREATETABLEpkslow_person_l2PARTITIONOFpkslow_person_lFORVALUESIN('BJ');CREATETABLEpkslow_person_l3PARTITIONOFpkslow_person_lDEFAULT;--Inserttestdatainsertintopkslow_person_l(age,city)VALUES(1,'GZ');insertintopkslow_person_l(age,city)VALUES(2,'SZ');insertintopkslow_person_l(age,city)VALUES(21,'SZ');insertintopkslow_person_l(age,city)VALUES(13,'BJ');insertintopkslow_person_l(age,city)VALUES(43,'SH');insertintopkslow_person_l(age,city)VALUES(28,'HK');insertintopkslow_person_l(age,city))VALUES(28,'GZ');Whenwequerythefirstpartition,onlythedataofGuangzhou:2.3HashhashpartitionHashpartitionreferstothepartitionaftertakingthehashvalueaccordingtothefield.具体的语句如下:--创建主表createtablepkslow_person_h(ageintnotnull,cityvarcharnotnull)partitionbyhash(city);--创建分区表createtablepkslow_person_h1partitionofpkslow_person_hforvalueswith(modulus4,remainder0);createtablepkslow_person_h2partitionofpkslow_person_hforvalueswith(modulus4,remainder1);createtablepkslow_person_h3partitionofpkslow_person_hforvalueswith(modulus4,remainder2);createtablepkslow_person_h4partitionofpkslow_person_hforvalueswith(modulus4,remainder3);--插入测试数据insertintopkslow_person_h(age,city)VALUES(1,'GZ');insertintopkslow_person_h(age,city)VALUES(2,'SZ');insertintopkslow_person_h(age,city)VALUES(21,'SZ');insertintopkslow_person_h(age,city)VALUES(13,'BJ');insertintopkslow_person_h(age,city)VALUES(43,'SH');insertintopkslow_person_h(age,city)VALUES(28,'HK');我们看到我们在创建分区表的时候,使用了取模的方法,所以如果我们要创建N个分区表,就需要对N个取模。随机查询一个分区表如下:可以看到同一个SZ的hash值相同,肯定会分到同一个分区,BJ的hash值取模后也属于同一个分区.3小结本文讲解了PostgreSQL分区的三种方式。
