我这样创建索引
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);