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

SQL Multiple column index not working with LIKE queries

考虑 table 如下

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%' 只适用于单列索引。

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

该查询的完美索引是:

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

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

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