如何在postgresql gist索引类型中使用uuid?

xjo*_*oin 8 postgresql indexing uuid gist-index

我不能直接使用uist和gist索引

CREATE INDEX idx_leaderboads_values_gist
  ON leaderboard_entry
  USING gist
  (id_leaderboard , value);
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

错误:数据类型uuid没有访问方法"gist"的默认运算符类

提示:您必须为索引指定运算符类,或者为数据类型定义默认运算符类.

Erw*_*ter 10

Postgres 10或更新

btree_gist现在也涵盖了数据类型uuid,就像Paul评论的那样.(以及其他一些数据类型,非常enum类型.)

现在您需要做的是:每个数据库安装一次扩展:

CREATE EXTENSION btree_gist;
Run Code Online (Sandbox Code Playgroud)

然后你的索引应该工作.

有关:


Postgres 9.6或更高版本

(原来的答复).
通常我会建议附加模块btree_gist,但类型uuid覆盖它.

理论上,由于UUID a 128-bit quantity(每个文档),最有效的方法是将其转换为两个bigintfloat8用于索引.但是这些演员阵容都没有在标准的Postgres中定义.

在pqsql-hackers列表中找到了朝这个方向刺,但似乎没有成功.

剩下的选项是表示的函数GiST索引text:

CREATE INDEX idx_leaderboads_values_gist
ON leaderboard_entry USING gist (id_leaderboard, cast("value" AS text));
Run Code Online (Sandbox Code Playgroud)

要使用此功能索引,查询必须与该表达式匹配.您可以"value"::text在查询中使用简写(但不能在索引定义中使用,而不添加更多括号).

旁白:不要使用value列名,它是标准SQL中保留字.

问题是:为什么需要GiST指数.最好的解决方案取决于目标.


Rya*_*yan 5

如果您使用的是 Postgres 10,并且使用转储/恢复从以前的版本迁移数据库,则可能需要运行:

ALTER EXTENSION btree_gist UPDATE;
Run Code Online (Sandbox Code Playgroud)

为了让要点索引与 UUID 一起使用。