Postgresql 我可以为(unnest)数组编制索引吗?
我想写一些像这样的东西Postgresql 我可以为(unnest)数组编制索引吗?,postgresql,Postgresql,我想写一些像这样的东西 create index on thread(unnest(tags)); 但是我得到了错误 错误:索引表达式无法返回集合 基本上,我想找到所有tagid为2的文档(),我假设下面的行为就像一个blob(我找不到[1,2],因为我的查询中没有1) 如果您知道要查找的确切值,可以使用smth,如 create index on thread(tags @> '{2}'); 如果你有更高版本的postgres(),你可以使用array\u position 并回答
create index on thread(unnest(tags));
但是我得到了错误
错误:索引表达式无法返回集合
基本上,我想找到所有tagid为2的文档(),我假设下面的行为就像一个blob(我找不到[1,2],因为我的查询中没有1)
如果您知道要查找的确切值,可以使用smth,如
create index on thread(tags @> '{2}');
如果你有更高版本的postgres(),你可以使用array\u position
并回答您的问题:
不能将unnest
用作索引的函数使用:
。。。然后使用以下命令查询表:
:数组不是集合;搜索特定数组元素可能是数据库设计错误的标志。考虑为每个项目使用一个单独的表,这将是一个数组元素。这将更容易搜索,并且可能对大量元素进行更好的扩展。@pozs:另一个用户链接了我,显示了您的建议性能较差,而text[]性能更好(但是我的标记有元数据,所以我不能使用text[])只问了几个问题。如果我不使用gin编写
,会发生什么?从我之前看到的来看,杜松子酒似乎是一种杂烩?如果我使用索引/int,它会使用int值吗?@acidzombie:如果你不说使用gin
,你会得到一个btree
,索引只会被涉及=
/
比较的查询使用。在内部,我认为GIN索引只是一个B树,但它的键是数组成员,而不是数组本身。您可以在中阅读有关实现的更多信息。谢谢nick,这听起来很完美。我很紧张,不知道会发生什么。看起来(从您和文档中)默认的btree必须与键/数组完全匹配,并且这个文档说它可以对一行使用多个索引。听起来很完美。谢谢
create index on thread(tags @> '{2}');
CREATE INDEX ON thread USING gin (tags);
SELECT * FROM thread WHERE tags @> ARRAY[2];