URL文本字段的查询优化

时间:2018-01-16 21:41:58

标签: postgresql query-optimization

我使用eCAP协议为Squid编码域名,URL和Regex(如SquidGuard)过滤器,我希望将所有域存储到postgresql数据库中。问题是,当我用例如:

进行搜索时
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'' 923元组的查询滞后490毫秒,但这对于squid代理的所有请求都不好。

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

我尝试使用FullText搜索,但这有英文标记,数据是网址(www.google.com/query?data1=3),域名(bing.com)和正则表达式(。*。cu)。

1 个答案:

答案 0 :(得分:2)

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

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_pattern_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')

但你应该试试。