1

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

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 匹配项,然后通过临时表(有时使用文件排序)将它们减少为一个。我宁愿它进行某种短路评估-在找到相同身份后,不要进一步追求任何后续任务匹配。

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

4

3 回答 3

1

只需将“SELECT DISTINCT”与您所拥有的一起使用在mysql中应该是有效的。您可能需要将您的值放在一个表中并加入它,而不是使用“IN (...)”。

于 2009-05-26T02:14:39.720 回答
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)
于 2009-05-26T02:13:58.350 回答
0

只要您在子查询中比较的列被索引,Exists 应该对您执行得很好。

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

于 2009-05-26T02:18:15.063 回答