在某些應用場景中,隨着時間的流逝,歷史數據不多被訪問,主要是訪問新產生的數據。這種狀況下會把不多訪問的數據存儲到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,就會到對應的表中查詢,而不是查詢兩張表,從而能夠提高速度。用戶體驗
經過上面的方法就能夠解決冷熱數據分離 查詢的問題了。歡迎你們使用。配置