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 结果,只有 b
和 c
在使用索引。似乎 LIKE 'a%'
只适用于单列索引。
那么,如何提高上述查询的查询速度呢?
该查询的完美索引是:
CREATE INDEX ON test (b, c, a varchar_pattern_ops);
您需要 varchar_pattern_ops
作为 LIKE
条件,除非该列使用 C
(或等效的 POSIX
)排序规则。 运行 SHOW lc_collate;
查看您的默认排序规则。
您的索引可能无法使用,因为您使用的是不同的排序规则。此外,LIKE
条件会导致索引范围扫描,所有具有相等条件的列都应在索引 之前 具有范围扫描的列。
考虑 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 结果,只有 b
和 c
在使用索引。似乎 LIKE 'a%'
只适用于单列索引。
那么,如何提高上述查询的查询速度呢?
该查询的完美索引是:
CREATE INDEX ON test (b, c, a varchar_pattern_ops);
您需要 varchar_pattern_ops
作为 LIKE
条件,除非该列使用 C
(或等效的 POSIX
)排序规则。 运行 SHOW lc_collate;
查看您的默认排序规则。
您的索引可能无法使用,因为您使用的是不同的排序规则。此外,LIKE
条件会导致索引范围扫描,所有具有相等条件的列都应在索引 之前 具有范围扫描的列。