在我的PostgreSQL 12.8数据库中,我有一个相对简单的表the_table
,其中有一列value
类型为varchar
:
CREATE TABLE public.the_table (
id uuid DEFAULT gen_random_uuid() NOT NULL,
label character varying,
value character varying,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
);
Run Code Online (Sandbox Code Playgroud)
我想查询具有格式为电子邮件地址的值的所有行。查询看起来像这样:SELECT * FROM the_table WHERE value ~ '^[a-zA-Z0-9.$%&*+/=?^_{|}~-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9]+$'
。
由于该表中有几百万行,我尝试通过添加匹配的表达式索引来加速此查询CREATE INDEX index_the_table_on_email_values ON the_table ((value ~ '^[a-zA-Z0-9.$%&*+/=?^_{|}~-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9]+$'));
不幸的是,查询计划程序不使用索引,而是对表执行完整扫描,这非常慢。
有人可以帮我修复索引或告诉我还有什么其他选择吗?我已经考虑过生成布尔列is_email
。我可以向生成的列添加索引并直接查询它。但这对于原始问题来说似乎是一个奇怪的解决方法,应该可以通过匹配的索引来解决,对吗?