首页 > 解决方案 > MySQL索引表连接多列

问题描述

我正在尝试修复必须按两个或多个字段映射的库存结构,但我对最佳方法感到困惑。

我的结构不是很重要,因为我可以根据需要重新创建。原始版本未标准化,仅包含两个表。在一张桌子上出售的零件。必填字段:SKU、MPN、品牌、成本 对方的供应商库存。必填字段:SKU、MPN、品牌、供应商、仓库、成本

SKU和MPN不一定相同,parts.SKU是商店的SKU,supplier.SKU是供应商的SKU。MPN 是品牌的 MPN,但在某些情况下,一个供应商可能使用品牌的 sku 作为 MPN,而另一个供应商将使用品牌的 MPN。这就是规范化表出现问题的地方。

我尝试使用相关 ID 拆分供应商和仓库的规范化表。像这样的查询按预期工作并以合理的速度执行:

SELECT * FROM parts p
JOIN warehouse w ON w.id = p.warehouse
JOIN supplier s ON s.id = w.supplier
JOIN inventory i ON i.brand = p.brand AND i.mpn = p.mpn

这有一个 p.mpn 的索引并按预期运行。相同的代码,将 p.mpn 替换为 p.sku 将返回其他匹配的部分。当试图通过替换查询将它们组合在一起时,AND i.mpn =AND (i.mpn = p.mpn OR i.mpn = p.sku)使用任何一个索引并且运行速度很慢,它永远不会完成(我让它运行了大约 2 分钟,然后取消它)

为了解决这个问题,我尝试使用 UNION 复制上述查询;这主要解决了性能问题,因为查询运行约 2 秒。(但是,每个自己运行〜0.01秒)

所以我的问题是:有没有办法JOIN on X = Y OR X = Z同时使用索引来保持速度?如果没有,我应该回到未标准化的表吗?(这在为客户服务代表开发 HTML 前端以查看和修改数据时会受到伤害)或者,您对构建 MySQL 数据库以处理匹配供应商信息以存储信息的要求有什么建议,当不同的供应商使用不同的 MPN 来代表同一个?例如,一个品牌有一个数字 SKU123和一个字母数字 MPN ABC。一家供应商使用 MPN 123,而另一家则使用 MPN ABC。为了匹配商店,它使用 SKU123和 MPNABC 目前,只使用了两个可能的值,但第三个供应商可能只使用 UPC 进行匹配,我需要将其添加为第三个条件。所以需要支持多个可能的匹配值的东西。我尝试使用 UNION 会很麻烦,甚至会更慢,因为每个可能的匹配条件都会重复查询。

我确信有多种方法可以处理这个问题,所以任何建议都将不胜感激。

标签: mysqljoin

解决方案


推荐阅读