postgresql - URL 文本字段的查询优化

标签 postgresql query-optimization

我正在使用 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/

相关文章:

postgresql - 如何在属性不为 NULL 的 PostgreSQL 表中进行选择?

sql - 复合键每组行的序列号

关于 FLEX 的 postgresql 安装警告

mysql - 我希望使用 MySql 优化此查询

sql - 优化sql更新语法而不是服务器

database - Oracle 索引包含另一个索引的所有列,无论正确还是错误

python - 更改 models.py 中属性的数据类型后,Django 迁移未应用于 Postgres

sql - 从 Postgres 查询格式化嵌套的 JSON 对象

postgresql - 为什么 Postgres 在我的 JOIN 子句中使用顺序扫描?

mysql - (Mysql 基础知识等等