SQL多列索引不适用于LIKE查询

时间:2018-12-18 07:54:31

标签: sql postgresql sql-like database-indexes

考虑如下表格

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结果,只有bc在使用索引。看来LIKE 'a%'仅适用于单列索引。

那么,如何提高上述查询的查询速度?

1 个答案:

答案 0 :(得分:2)

该查询的理想索引是:

CREATE INDEX ON test (b, c, a varchar_pattern_ops);

除非列使用varchar_pattern_ops(或等效的LIKE)排序规则,否则您需要C用于POSIX条件。运行SHOW lc_collate;来查看默认排序规则。

您的索引可能无法使用,因为您使用的是其他排序规则。此外,LIKE条件会导致进行索引范围扫描,并且所有具有相等条件的列都应在具有范围扫描列的之前索引中。