【发布时间】:2015-09-15 10:06:36
【问题描述】:
我有一个视图,我在其中组合了一些规范化的表。基于“主”表,我加入连接表(例如JOIN child ON master.child_fk = child.pk)。这很简单。现在,我想扩展此查询以在某些特殊情况下对所有子行执行连接,例如如果master.child_fk 等于-1。
我设法通过创建一个视图来复制所有行并将重复项中的 pk 设置为 -1 来获得工作查询,但这非常慢(我有很多数据)。通过遍历所有child.pks 并为每个@s 执行单独的连接可以产生相同的结果,但我无法想象会更快。
使用 MySQL 解决此问题的最佳方法是什么?如果有不清楚的地方请提出问题。
编辑:我可以补充一点,我的尝试缓慢的原因似乎是索引利用率低。在此处查看附件EXPLAIN 输出https://i.imgur.com/8zfT0HM.png
【问题讨论】:
-
将你的加入条件替换为
JOIN child ON CASE WHEN master.child_fk != -1 THEN master.child_fk = child.pk ELSE 1 END)你能粘贴你的查询吗? -
我爱你。它工作得很好:)
-
我已将其更新为答案