【问题标题】:Convert a MySQL NOT EXISTS into an INNER JOIN将 MySQL NOT EXISTS 转换为 INNER JOIN
【发布时间】:2017-01-08 08:44:36
【问题描述】:

我对加入有点陌生,所以我什至不确定这是否可能。我一直在谷歌搜索并尝试了一些东西..

我需要什么:

选择data.id 对应的user2data.user_id 不存在 where user2data.user_id = 'X'

令人兴奋对吧? :D

什么有效:

SELECT * FROM data WHERE NOT EXISTS (SELECT * FROM user2data WHERE user2data.user_id=1 AND user2data.data_id=data.id) LIMIT 100;

但是,即使所有 3 列都已编入索引,它也很慢。为此,我从另一个 SO 答案中尝试了 OUTER JOIN,但它比上面的还要慢。我需要的是 INNER JOIN。

请让我知道这是否真的可行,或者是否有利用索引的替代方法。

谢谢,最好的

【问题讨论】:

  • 我建议在 user2data 上使用 复合 索引而不是 (user_id, data_id)
  • 您不能对不存在的数据进行内部联接。
  • 确保要加入的列已编入索引,然后外部联接应该很快。
  • @eggyal 感谢您的建议。它确实加快了一些速度,但并不接近在类似情况下内部连接所带来的性能
  • 查看@Quassnoi 的博客,了解在not-nullablenullable 列上执行反连接操作时的性能讨论。

标签: mysql join inner-join not-exists


【解决方案1】:

你可以使用左连接

SELECT * 
FROM data WHERE 
LEFT JOIN user2data ON (  user2data.user_id=1 AND user2data.data_id=data.id )
where user2data.data_id is null
LIMIT 100;

【讨论】:

  • 他说他试过这个:为此我尝试了一个 OUTER JOIN
  • @Barmar 你知道我同意 OP 提到使用外连接。但我也想知道 OP 是否提出了上面使用的正确连接条件。
  • 他说他是从另一个 SO 答案中得到的。关于如何获取与另一个表不匹配的所有行有很多 SO 问题,例如stackoverflow.com/questions/21633115/…
猜你喜欢
  • 1970-01-01
  • 2015-06-05
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
相关资源
最近更新 更多