是的,绝对有可能。使用表达式索引。棘手的部分是复合类型的语法。
复杂类型元素上的 B 树索引:
CREATE TABLE tbl (tbl_id serial, co complex);
CREATE INDEX tbl_co_r_idx ON tbl (((co).r)); -- note the parentheses!
db<>fiddle here - 使用EXPLAIN ANALYZE
旧sqlfiddle
同样的事情适用于数组的预定元素(不适用于整个数组!),即使对于复合类型的数组也是如此:
CREATE TABLE tbl2 (tbl2_id serial, co complex[]);
CREATE INDEX tbl2_co1_idx ON tbl2 ((co[1])); -- note the parentheses!
请注意,如果表达式或多或少在字面上匹配,则表达式索引只能用于查询。
但这对于您提到的GIN索引没有意义。手册:
GIN 代表广义倒排索引。GIN 设计用于处理要索引的项目是复合值的情况,并且要由索引处理的查询需要搜索出现在复合项目中的元素值。
GIN 索引对整个复杂类型的数组是有意义的,让您可以在其中搜索元素。但是您需要针对您的特定类型的实现。这是标准 Postgres 中的示例列表(除了对所有一维数组的基本支持)。