• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

【原创】PostgreSQL hstore 列性能提升一例

mysql 搞代码 4年前 (2022-01-09) 11次浏览 已收录 0个评论

PostgreSQL支持hstore来存放KEY-VALUE这类数据,其实也类似于ARRAY或者JSON类型。要高效的使用这类数据,当然离不开高效的索引。我们今天就来看看两类不同的索引

PostgreSQL 支持hstore 来存放KEY->VALUE这类数据, 其实也类似于ARRAY或者JSON类型。 要高效的使用这类数据,当然离不开高效的索引。我们今天就来看看两类不同的索引对于同一种检索请求的性能问题。

假如我们有这样一个原始表,基于str1字段有一个BTREE索引。

t_girl=# \d status_check; Table “ytt.status_check” Column | Type | Modifiers ——–+———————–+———– is_yes | boolean | not null str1 | character varying(20) | not null str2 | character varying(20) | not nullIndexes: “index_status_check_str1” btree (str1)

里面有10W条记录。 数据大概如下,

t_girl=# select * from status_check limit 2; is_yes | str1 | str2 ——–+——+———————- f | 0 | cfcd208495d565ef66e7 t | 1 | c4ca4238a0b923820dcc(2 rows)Time: 0.617 mst_girl=#

存放hstore类型的status_check_hstore 表结构,基于str1_str2字段有一个GIST索引。

Table “ytt.status_check_hstore” Column | Type | Modifiers ———–+———+———– is_yes | boolean | str1_str2 | hstore | Indexes: “idx_str_str2_gist” gist (str1_str2) t_girl=# select * from status_check_hstore limit 2; is_yes | str1_str2 ——–+—————————– f | “0”=>”cfcd208495d565ef66e7″ t | “1”=>”c4ca4238a0b923820dcc”(2 rows)Time: 39.874 ms

接下来我们要得到跟查询原始表一样的结果,当然原始表的查询非常高效。 表语句以及结果如下,

t_girl=# select * from status_check where str1 in (’10’,’23’,’33’); is_yes | str1 | str2 ——–+——+———————- t | 10 | d3d9446802a44259755d t | 23 | 37693cfc748049e45d87 f | 33 | 182be0c5cdcd5072bb18(3 rows)Time: 0.690 ms

上面的语句用了不到1毫秒。

接下来我们对hstore表进行查询,

t_girl=# select i来源gaodaimacom搞#^代%!码网s_yes,skeys(str1_str2),svals(str1_str2) from status_check_hstore where str1_str2 ?| array[’10’,’23’,’33’]; is_yes | skeys | svals ——–+——-+———————- t | 10 | d3d9446802a44259755d t | 23 | 37693cfc748049e45d87 f | 33 | 182be0c5cdcd5072bb18(3 rows)Time: 40.256 ms

我的天,比原始表的查询慢了几十倍。

看下查询计划,把所有行都扫描了一遍。

QUERY PLAN ———————————————————————————– Bitmap Heap Scan on status_check_hstore (cost=5.06..790.12 rows=100000 width=38) Recheck Cond: (str1_str2 ?| ‘{10,23,33}’::text[]) -> Bitmap Index Scan on idx_str_str2_gist (cost=0.00..5.03 rows=100 width=0) Index Cond: (str1_str2 ?| ‘{10,23,33}’::text[])(4 rows)Time: 0.688 ms

我们想办法来优化这条语句, 如果把这条语句变成跟原始语句一样的话,那么是否就可以用到BTREE索引了?


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:【原创】PostgreSQL hstore 列性能提升一例

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址