Postgresql URL文本字段的查询优化

Postgresql URL文本字段的查询优化,postgresql,query-optimization,Postgresql,Query Optimization,我正在使用eCAP协议为Squid编写一个域、URL和正则表达式(比如SquidGuard)过滤器,我希望将所有域存储到postgresql数据库中。问题是,当我使用like进行搜索时,例如: SELECT website_groups.id, "name", description FROM website_domains JOIN website_groups ON website_group_id = website_groups.id WHERE (we

我正在使用eCAP协议为Squid编写一个域、URL和正则表达式(比如SquidGuard)过滤器,我希望将所有域存储到postgresql数据库中。问题是,当我使用like进行搜索时,例如:

SELECT website_groups.id,
       "name",
       description
FROM website_domains
   JOIN website_groups ON website_group_id = website_groups.id
WHERE (website_domains.domain = 'google.com'
    OR website_domains.domain LIKE '%.google.com')
对1'605'923元组的查询有490ms的延迟,但这对所有对squid代理的请求都是不利的

我的问题是如何优化PostgreSQL以使查询更快,或者我需要使用NoSQL数据库(我使用MongoDB进行测试,并在609ms内以更少的数据进行查询)


我尝试了全文搜索,但它有英文标记,数据是URL(www.google.com/query?data1=3)、域(bing.com)和Regex(.*.cu)。

您可以尝试为反向域字符串创建一列并在其上创建索引:

ALTER TABLE website_domains ADD reverse_domain VARCHAR(100);
UPDATE website_domains SET reverse_domain = REVERSE(domain);
CREATE INDEX reverse_domain_index ON 
    website_domains (reverse_domain varchar_pattern_ops);
varchar\u pattern\u ops
允许
LIKE
在可能的情况下使用此索引

前缀搜索也通过反转模式来完成:

... OR website_domains.reverse_domain LIKE REVERSE('%.google.com')
您可能可以避免使用计算索引的额外列

CREATE INDEX reverse_domain_index ON 
    website_domains (REVERSE(domain) varchar_pattern_ops);
以及以下条款:

.. OR REVERSE(website_domains.domain) LIKE REVERSE('%.google.com')

但是你应该试试。

Ohhh!!!现在只在12毫秒内进行查询谢谢,最后我使用的索引ufff非常快,如果你能在简短的回答中解释一下为什么这么快……索引基于搜索树,这对精确匹配和前缀匹配都有好处。在树中搜索精确匹配实际上是一种前缀搜索。当您进行后缀搜索(如
。或反向搜索(website\u domains.domain),如反向搜索('www.google.%')
时,搜索速度应该总是很慢。请查看查询计划。