我正在使用 eCAP 协议(protocol)为 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 元组有 490 毫秒的延迟,但这对所有对 squid 代理的请求都是不利的。
我的问题是如何优化 PostgreSQL 以使该查询更快,或者我需要使用 NoSQL 数据库(我使用 MongoDB 进行测试并在 609 毫秒内使用更少的数据进行查询)。
我尝试使用全文搜索,但它有英文标记,数据是 URL (www.google.com/query?data1=3)、域 (bing.com) 和正则表达式 (.*.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_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')
但你应该试试。
关于postgresql - URL 文本字段的查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48290282/