mysql - 如何交叉引用 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 秒。
解决方案
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)
推荐阅读
- react-native - 'react-native-mathjax' 高度自动调整不起作用
- php - 如何动态修改 PHP 中 meta 属性="og:image" 的内容?
- python - python:RecursionError:调用将数据帧传递给类方法的Python对象时超出了最大递归深度
- node.js - 在 node.js 中上传多个图像时出错
- c# - 不要在 BindingSource C# 中对历史列进行排序
- outlook - Outlook 日历 API 支持哪些 Outlook 产品?
- react-native - AppRegistry 在 React-Native 中的使用?有例子吗?
- vue.js - Vuejs将动态数据从父组件传递给子组件
- python - 为什么python多处理初始化相同的值?
- google-compute-engine - 在 Google Compute Engine 中创建暂存 VM