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

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

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

最佳答案

该查询的完美索引是:

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

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

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

关于SQL 多列索引不适用于 LIKE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53828526/

相关文章:

ruby-on-rails - Rails/Postgres 嵌套 JSON 查询

php - 带有 LIKE、通配符和前导零的 MySQL SELECT

php - 在现有项目上使用 ORM 的最佳方式是什么

sql查询-如何分别计算一行中的值?

sql - MySql慢查询页面详情

mysql - 这两个查询之间的效率或其他差异是什么?

sql - 我怎样才能加入这些表来获得这个计数?

hibernate - JDBC 类型 : 2003 没有方言映射

SQLite 查询, 'LIKE'

MySQL LIKE 仅匹配整数