首页 > 解决方案 > 如何交叉引用 MySQL 中的第三个表?

问题描述

我在 MySQL 5.7 DB 中有以下表:

1. Search Result (100M+ rows)

SERP | ARTICLE_ID
1    | 88
2    | 99


2. Bundles (5k rows)

ARTICLE_ID | PRODUCT_ID
99         | 123
99         | 124


3. Product Catalog (1M rows)

PRODUCT_ID | NAME

123        | Bundle Product1
124        | Bundle Product2
88         | Native Product

现在大多数商品都是原生产品,而不是捆绑商品。但是,捆绑表中定义了一些捆绑包。此表引用产品表中的所属产品。我不知道 article_id 是捆绑包还是原生产品,只知道捆绑表中是否有条目。

现在,如果文章 id 在捆绑表中,我希望扩展我的扩展查询以处理捆绑包。

像这样的东西:

SELECT mks.*
FROM serps mks
LEFT JOIN products p on mks.ARTICLE_ID = p.SKU

-- BUNDLE Recognition
LEFT JOIN bundles bun ON mks.ARTICLE_ID = bun.ARTICLE_ID
LEFT JOIN products bp ON bun.SKU = bp.SKU

WHERE p.somethign = 2 OR bp.somehting = 2

这也有效,但速度很慢:

FROM serps mks
LEFT JOIN bundles bun ON mks.ARTICLE_ID = bun.ARTICLE_ID -- BUNDLE Recognition
LEFT JOIN products p on bun.SKU = p.SKU OR mks.ARTICLE_ID = p.SKU

如果我对最后一个 leftjoin 进行单独查询,结果将在 300 毫秒内返回:

-- this returns native results only in 300ms
LEFT JOIN products p on mks.ARTICLE_ID = p.SKU

-- this returns bundles only in 200ms
LEFT JOIN products p on bun.SKU = p.SKU 

两者的结合需要 5 秒。

这是另一种方法:

FROM (
  SELECT SERP, ARTICLE_ID
    FROM merchants_keyword_serps
    AND DATE = 20210621
  UNION ALL
  SELECT mksi.SERP, bun.SKU AS ARTICLE_ID
    FROM serps mksi
    JOIN bundles bun ON mksi.ARTICLE_ID = bun.ARTICLE_ID
    AND mksi.DATE = 20210621
  ) mks
LEFT JOIN Maven360.manufacturers_products p on  mks.ARTICLE_ID = p.SKU 

每个选择需要 150 毫秒,但使用 UNION 需要几秒钟。

这是一个非常基本的示例,我想知道是否有类似交叉连接之类的东西或任何我认为不会允许查询在 OK 时间 < 500 毫秒内执行的东西。目前,捆绑集成将其从 200 毫秒提升到 5 秒。

标签: mysql

解决方案


FROM (
  SELECT SERP, ARTICLE_ID
    FROM merchants_keyword_serps
    AND DATE = 20210621
  UNION ALL
  SELECT mksi.SERP, bun.SKU AS ARTICLE_ID
    FROM serps mksi
    JOIN bundles bun ON mksi.ARTICLE_ID = bun.ARTICLE_ID
    AND mksi.DATE = 20210621
  ) mks
LEFT JOIN Maven360.manufacturers_products p on  mks.ARTICLE_ID = p.SKU 

大概需要这些:

merchants_keyword_serps:  INDEX(date)
serps:  INDEX(date, article_id)
bundles:  INDEX(article_id)
manufacturers_products:  INDEX(SKU)

推荐阅读