在 Postgres 中创建索引时如何组合 LEFT 和 LOWER?

问题描述 投票:0回答:1

我这样创建索引

CREATE INDEX rep_tval_idx ON public.rep USING btree (t, lower(left(val, 127)));

然后尝试以同样的方式选择

explain  select * from dup where t=3 and lower(left(val, 127)) like 'operation%';

根据EXPLAIN,在这种情况下不会使用索引。 如何使其适用于索引中的两种条件?字段类型是 TEXT,我不想存储超过 127 个字符的内容。

解释分析结果:

Index Scan using dup_tval_idx on dup  (cost=0.14..3.67 rows=1 width=56) (actual time=0.044..0.045 rows=0 loops=1)
  Index Cond: (t = 3)
  Filter: (lower("left"(val, 127)) ~~ 'operation%'::text)
  Rows Removed by Filter: 16
Planning Time: 0.112 ms
Execution Time: 0.069 ms

这种结构只有一个表,当我单独使用 LOWER 或 LEFT 时,它们在索引中工作正常。

CREATE TABLE public.rep (
    id bigserial NOT NULL,
    up int8 NOT NULL,
    t int8 NOT NULL,
    val text NULL,
    CONSTRAINT rep_pk PRIMARY KEY (id)
);
CREATE INDEX rep_tval_idx ON public.rep USING btree (t, lower("left"(val, 127)));
CREATE INDEX rep_upt_idx ON public.rep USING btree (up, t);
postgresql indexing
1个回答
0
投票
默认情况下,

btree
索引非常适合
<
>
=
,但不能用于模式匹配。

您必须使用

text_pattern_ops
创建索引才能逐个字符建立索引。在这个博客

中查看它的实际应用
© www.soinside.com 2019 - 2024. All rights reserved.