我想以最有效的方式从一个表中选择与另一个表中的“一个或多个”行匹配的所有行。
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子查询,但我不知道这些是如何优化的。我需要先在身份表之前加入任务表,所以我没有对身份表进行全面扫描,这个身份表非常庞大并且会有很多不匹配。
答案 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中遇到了足够多的性能问题,我的预测是错误的,知道它值得一试。