PostgreSQL对具有比没有索引更长的索引的列进行查询

时间:2018-10-31 18:59:54

标签: postgresql performance optimization indexing postgresql-performance

我创建了一个简单的表,如下所示:

CREATE TABLE IF NOT EXISTS "public"."bench2" (
      "tags_text_1" text[],
      "tags_text_2" text[]
)

我在创建的第一列上有一个索引:

CREATE INDEX "idx_tags_text_1" ON "public"."bench2" USING gin ("tags_text_1")

我插入了1500万行,其中1到10个随机字符串分别作为tag1,tag2,...,tag10,并在两列中插入了相同的元素,因此tag_text_1始终与tags_text_2相同

我在我的2017 Mac Book Pro版本上使用Postgres:

PostgreSQL 10.5 on x86_64-apple-darwin14.5.0, compiled by Apple LLVM version 7.0.0 (clang-700.1.76), 64-bit

我正在尝试像这样的两个字段进行查询:

SELECT count(*) from bench2 WHERE tags_text_1 && ARRAY['tag1']

Explain

SELECT count(*) from bench2 WHERE tags_text_2 && ARRAY['tag1']

Explain

这两个查询不使用索引,每个查询花费4秒

SELECT count(*) from bench2 WHERE tags_text_1 @> ARRAY['tag1']

Explain

SELECT count(*) from bench2 WHERE tags_text_2 @> ARRAY['tag1']

Explain

这两个查询不使用索引,每个查询也要花费4秒

SELECT count(*) from bench2 WHERE tags_text_1 <@ ARRAY['tag1']

Explain

SELECT count(*) from bench2 WHERE tags_text_2 <@ ARRAY['tag1']

Explain

第一个使用索引需要8.5秒,第二个不使用索引需要2.8秒。

我不明白。为什么只有<@运算符使用索引?为什么使用索引的查询执行时间最长? 我正在尝试优化查询以搜索标签与至少一个标签匹配的行,因此&&。 知道发生了什么吗?我是否应该了解PostgreSQL配置(1500万条记录的索引大小为100 Mb)。我不得不承认我有点迷路。

0 个答案:

没有答案