在百万、千万级数据的一张 PostgreSQL 表中如何高效搜索一个指定的内容

2020-11-23 00:20:22 +08:00
 bandian

待搜索的字段为 json 类型,要做的是模糊匹配。

如果直接使用 like 匹配,性能上感觉应该会爆炸,不知道有没有什么原生的比较高效或者耗时短的查询方式。

1153 次点击
所在节点    问与答
3 条回复
angryfish
2020-11-23 07:33:49 +08:00
mysql 可以创建虚拟字段,映射要查询的 json 字段,不知道 postgresql 有没有
abcfyk
2020-11-23 10:04:11 +08:00
要么牺牲写速度,解析 json 出来再写,
要么牺牲读速度,直接存 json,读的时候解析

非要存 pg,就这两个方向,其他的优化都是隔靴搔痒
MoYi123
2020-11-23 10:27:09 +08:00
不清楚你具体要怎样做模糊查询,举几种常见场景
1. 查询 json 中的第一层存在 key 为 1 的行,比如{"1":"abc"},需要在 json 列建 gin 索引
create index test_data1_gin on test using gin (data1);
select * from test where data1 ? '1';

2. 查询 json 中某个具体键的值,比如{'age':18},需要对 json->>'age'建索引
create index test_data1_btree on test using btree ((data1 ->> 'age'));
select * from test where data1 ->> 'age' = 18;

3. like '":2' 比如'{"1":2}', 那这一列不应该存为 json,应该存为 text,然后加上 gin 索引

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/728163

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX