【问题标题】:Multi-column index vs. index on an array多列索引与数组索引
【发布时间】:2019-03-22 08:14:07
【问题描述】:

我是数据库新手,正在尝试学习 PostgreSQL。我的问题是:

有没有区别

CREATE INDEX the_index ON the_table (column1, column2);

CREATE INDEX the_index ON the_table (ARRAY[column1, column2]);

?

【问题讨论】:

  • 有趣的问题。为什么你会认为它们相似?第一个创建具有两个键的索引。第二个创建一个索引,其中一个键恰好是一个数组。他们在我看来真的很不一样,所以我不知道你为什么会想问这个问题。

标签: postgresql indexing


【解决方案1】:

由于您在这里谈论的是B-tree 索引,因此第二个索引甚至在 PostgreSQL 中都不起作用。这是因为 B 树索引只能在具有linear ordering 的数据上定义。

您可以将索引想象为指向表的条目的排序列表。 在多列索引的情况下,条目将按lexicographical 方式排序:首先,根据column1,然后——在每组相等的column1 中——根据column2

索引可用于索引中扫描的索引条目彼此相邻的所有查询:

... WHERE column1 = 'text' AND column2 = 42
... WHERE column1 < 'text'
... WHERE column1 = 'text' AND column1 > 42

索引不能用于扫描的索引条目不相邻的查询:

... WHERE upper(column1) = 'TEXT'
... WHERE column2 = 42
... WHERE column1 || column2 = 'text42'

数组上的索引是完全不同的东西。对于这些,您必须使用“GIN”访问方法:

CREATE INDEX the_index ON the_table USING gin (ARRAY[column1, column2]);

(假设两列具有相同的数据类型。)

这样的索引可用于加速查询,例如使用数组运算符&lt;@@&gt;=&amp;&amp;

... WHERE ARRAY[column1, column2] && ARRAY[1, 2, 3, 4, 5]

鉴于上面的WHERE 子句相当做作,我想说这样的索引在大多数情况下没有多大意义。

【讨论】:

  • 感谢您的详细解答。我对 SQL 和 ARRAY 感到非常困惑。现在我明白了!
猜你喜欢
  • 2011-11-07
  • 2010-09-15
  • 1970-01-01
  • 2018-07-27
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多