我使用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)。
答案 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')
但你应该试试。