安装hstore扩展:
postgres=# create extension hstore; CREATE EXTENSION postgres=#
进行测试:
建表:
postgresINSERT INTO hstore_test (data) VALUES ('"key1"=>"value1","key2"=>"value2","key3"=>"value3"'); INSERT 0 1 postgresselect * from hstore_test; item_id | data ---------+------------------------------------------------------ 1 | "key1"=>"value1","key2"=>"value2","key3"=>"value3" (1 row) postgres=#
修改数据:
(3 rows)
Postgresql 支持hstore 来存放KEY->VALUE这类数据, 其实也类似于ARRAY或者JSON类型。 要高效的使用这类数据,当然离不开高效的索引。我们今天就来看看两类不同的索引对于同一种检索请求的性能问题。
假如我们有这样一个原始表,基于str1字段有一个BTREE索引。
- t_girl=#\dstatus_check;
- Table"ytt.status_check"
- Column|Type|Modifiers
- --------+-----------------------+-----------
- is_yes|boolean|notnull
- str1|charactervarying(20)|null
- str2|Indexes:
- "index_status_check_str1"btree(str1)
里面有10W条记录。 数据大概如下,
- t_girl=#select*fromstatus_checklimit2;
- is_yes|str1|str2
- --------+------+----------------------
- f|0|cfcd208495d565ef66e7
- t|1|c4ca4238a0b923820dcc
- (2rows)
- Time
存放hstore类型的status_check_hstore 表结构,基于str1_str2字段有一个GIST索引。
- Table"ytt.status_check_hstore"
@H_768_502@Column|Type|Modifiers
- -----------+---------+-----------
- is_yes|boolean|
- str1_str2|hstore|
- "idx_str_str2_gist"gist(str1_str2)