我创建了一个简单的表,如下所示:
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']
SELECT count(*) from bench2 WHERE tags_text_2 && ARRAY['tag1']
这两个查询不使用索引,每个查询花费4秒
SELECT count(*) from bench2 WHERE tags_text_1 @> ARRAY['tag1']
SELECT count(*) from bench2 WHERE tags_text_2 @> ARRAY['tag1']
这两个查询不使用索引,每个查询也要花费4秒
SELECT count(*) from bench2 WHERE tags_text_1 <@ ARRAY['tag1']
SELECT count(*) from bench2 WHERE tags_text_2 <@ ARRAY['tag1']
第一个使用索引需要8.5秒,第二个不使用索引需要2.8秒。
我不明白。为什么只有<@运算符使用索引?为什么使用索引的查询执行时间最长? 我正在尝试优化查询以搜索标签与至少一个标签匹配的行,因此&&。 知道发生了什么吗?我是否应该了解PostgreSQL配置(1500万条记录的索引大小为100 Mb)。我不得不承认我有点迷路。