在某些应用场景中,随着时间的流逝,历史数据不多被访问,主要是访问新产生的数据。这种状况下会把不多访问的数据存储到IO比较慢的存储设备上,而把长期查询的数据存放到IO比较快的存储设备上面。好比,像网上交易系统,能够把几个月前的历史数据存放到机械硬盘上面,而把当月的数据存放到固态硬盘上面。从而让成本最优的状况下,提高用户体验。spa
pgoneproxy目前已经支持这种冷热数据分离的状况,只要使用pgoneproxy的分库分表功能,同时把method设置为buffer便可。下面来详细介绍下冷热数据分离查询的功能:code
当前假设把冷数据存放到bigtest_1的表中,把热数据放到bigtest_0的表中。其中假设id在0-100内的数据为热数据,而id在101-1000内的数据为冷数据,则proxy-part-tables项的配置为:字符串
[ { "table" : "bigtest", "pkey" : "id", "type" : "int", "method" : "buffer", "partitions": [ {"suffix":"_0", "group":"data1", "minval":"0", "maxval":"100"}, {"suffix":"_1", "group":"data1", "minval":"101","maxval":"1000"} ] } ]
经过上面的配置能够看到经过minval和maxval来指定数据的范围。其中minval和maxval能够是数字和字符串。it
若是须要以时间来进行分表操做,则能够修改pkey为时间的字段,同时设置type为time。在经过minval和maxval来指定时间的范围。io
查询时只要带上pkey指定的字段便可。pgoneproxy会根据pkey字段的值按照不一样的规则进行数据的查询。下面获得的数据状况:table
pgbench=> select * from bigtest_0; id | name | age ----+--------+----- 10 | name10 | 10 11 | name11 | 11 12 | name12 | 12 13 | name13 | 13 14 | name14 | 14 15 | name15 | 15 16 | name16 | 16 (7 rows) pgbench=> select * from bigtest_1; id | name | age -----+---------+----- 110 | name110 | 110 111 | name111 | 111 112 | name112 | 112 113 | name113 | 113 114 | name114 | 114 115 | name115 | 115 116 | name116 | 116 (7 rows) pgbench=> select * from bigtest where id = 10; id | name | age ----+--------+----- 10 | name10 | 10 (1 row) pgbench=> select * from bigtest where id = 110; id | name | age -----+---------+----- 110 | name110 | 110 (1 row)
也能够经过这个规则直接把数据插入到对应的表中。若是不指定id指点,则会把查询语句发送到两张表中进行查询。好比进行下面的查询操做:test
pgbench=> select * from bigtest where name = 'name110'; id | name | age -----+---------+----- 110 | name110 | 110
这个查询就会同时查询bigtest_0和bigtest_1表中的数据,最后进行合并后返回到客户端。像上面那样指定id,就会到对应的表中查询,而不是查询两张表,从而能够提高速度。用户体验
经过上面的方法就能够解决冷热数据分离 查询的问题了。欢迎你们使用。配置