考虑如下表格
CREATE TABLE test (
"a" varchar(32),
"b" varchar(32),
"c" varchar(32),
"d" varchar(32)
);
CREATE INDEX "test_index" ON test USING btree("a", "b", "c");
我需要执行
之类的查询SELECT count(*)
FROM test
WHERE a like 'a%'
and b = 'b'
and c = 'c'
EXPLAIN的结果显示如下
Aggregate (cost=10.36..10.37 rows=1 width=0)
-> Index Only Scan using test_index on test (cost=0.14..10.36 rows=1 width=0)
Index Cond: ((b = 'b'::text) AND (c = 'c'::text))
Filter: ((a)::text ~~ 'a%'::text)
根据Postgres的EXPLAIN结果,只有b
和c
在使用索引。看来LIKE 'a%'
仅适用于单列索引。
那么,如何提高上述查询的查询速度?
答案 0 :(得分:2)
该查询的理想索引是:
CREATE INDEX ON test (b, c, a varchar_pattern_ops);
除非列使用varchar_pattern_ops
(或等效的LIKE
)排序规则,否则您需要C
用于POSIX
条件。运行SHOW lc_collate;
来查看默认排序规则。
您的索引可能无法使用,因为您使用的是其他排序规则。此外,LIKE
条件会导致进行索引范围扫描,并且所有具有相等条件的列都应在具有范围扫描列的之前索引中。