快速选择另一个表中“1个或更多”匹配行的所有行

时间:2009-05-26 02:11:33

标签: sql mysql query-optimization

我想以最有效的方式从一个表中选择与另一个表中的“一个或多个”行匹配的所有行。

SELECT identity.id FROM identity
INNER JOIN task ON
  task.identityid=identity.id
  AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)

目前,如果有多个匹配任务,则会多次返回相同的身份(但是后面消除这些内容的性能损失并不算太差)。我希望相反,每个标识只返回一行,与一个或多个这些任务组匹配,我想知道是否有一种比DISTINCT或GROUP BY更有效的方法。

执行DISTINCT或GROUP BY的麻烦在于仍然会扫描任务表以查找所有groupid匹配项,然后通过临时表(有时使用filesort)将它们缩减为1。我宁愿做某种短路评估 - 在找到相同的身份后,不要进一步追求任何后续的任务匹配。

我在考虑做一个EXISTS子查询,但我不知道这些是如何优化的。我需要先在身份表之前加入任务表,所以我没有对身份表进行全面扫描,这个身份表非常庞大并且会有很多不匹配。

3 个答案:

答案 0 :(得分:1)

使用“SELECT DISTINCT”和你拥有的东西应该在mysql中有效。您可能需要将值放在表中并加入到表中,而不是使用“IN(...)”。

答案 1 :(得分:0)

MYSQL是否支持TOP N语法?如果是这样的话:

SELECT TOP 1 identity.id FROM identity
INNER JOIN task ON
  task.identityid=identity.id
  AND task.groupid IN (78, 122, 345, 12, 234, 778, 233, 123, 33)

答案 2 :(得分:0)

只要您在子查询中比较的列被编入索引,Exists应该对您执行正常的操作。

我希望存在会比join-and-group-by好一点,但我必须尝试才能确定。我在MySQL中遇到了足够多的性能问题,我的预测是错误的,知道它值得一试。