如何优化此 LIKE JOIN 查询?

Don*_*per 5 sql postgresql postgresql-9.5

此查询查找域的后缀:

        SELECT
        DISTINCT ON ("companyDomain".id)
            "companyDomain".domain,
            "publicSuffix".suffix
        FROM
            "companyDomain"
        INNER JOIN
            "publicSuffix"
        ON
            REVERSE("companyDomain".domain) LIKE REVERSE("publicSuffix".suffix) || '%'
        ORDER BY
            "companyDomain".id, LENGTH("publicSuffix".suffix) DESC
Run Code Online (Sandbox Code Playgroud)

编辑:注意这也适用于子域。

您可以摆弄此处的示例并使用pev可视化计划。我已经尝试向表中添加覆盖索引,但它们最终没有被查询规划器使用。也许还有另一个查询可能更有效?

Fel*_*van 0

怎么样:

SELECT 
  DISTINCT ON ("companyDomain".id) "companyDomain".domain, 
  "publicSuffix".suffix 
FROM 
  "companyDomain" 
  INNER JOIN "publicSuffix" ON RIGHT(
    domain, 
    - POSITION('.' IN domain) + 1
  ) = "publicSuffix".suffix 
ORDER BY 
  "companyDomain".id, 
  LENGTH("publicSuffix".suffix) DESC;
Run Code Online (Sandbox Code Playgroud)

我们获取域中第一个的位置.,然后使用该值的负值(+1 来包含第一个)从左侧.提取后缀。RIGHT

看起来它运行得更快,从 2500 毫秒到 120 毫秒。

现场测试

  • 谢谢,这要快得多,但它不适用于子域(something.google.com) (2认同)