我有一个包含超过 2500 万条记录的 Postgres 表,其中有一个名为 info 的 jsonb 列。
示例 json 格式:
{
"username1":{"name":"somename","age":22,"gender":"male"},
"fathername":{"name":"somename","age":22,"gender":"male"}
}
我要查找与“user%”键值匹配的记录数。
这是我的问题
select count(1) from tablename where info::text like '%user%';
此查询有效,我正在获取结果,但在 2500 万条记录中执行此查询需要很长时间。
有什么方法可以优化此查询或任何替代方法来实现它?请帮忙。
提前致谢!
最佳答案
正如@klin 所指出的,这个查询只会给你 0:
select count(1) from tablename where info::text like 'user%';
为什么,因为这只是一个简单的模式匹配,而您的信息列中没有任何以“user”开头的字符串。使用 '%user%' 可能会更好,但这会非常慢(除非您启用了 trigram 扩展并创建了索引)
如果您想准确计算有多少用户设置了username1
,这是一个非常简单的查询。
select count(1) from tablename where info ? 'username1'
这适用于 9.5 .如果您的“user%”关键字数量有限,您可以尝试这样的操作:
select count(1) from tablename where info ?| array['username1','username2',..]
如果您不确定 key 的性质,那么您可以这样做
SELECT COUNT(1) FROM (
SELECT * FROM JSONB_EACH(info) FROM tablename
) AS a WHERE a.key like '%user%'
关于json - 在 jsonb postgres 中替代 Like,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38571892/