代码之家  ›  专栏  ›  技术社区  ›  thomasrutter

快速选择其他表中具有“1或更多”匹配行的所有行

  •  1
  • thomasrutter  · 技术社区  · 17 年前

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

    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)将它们缩减为一个。我宁愿它做一些短路评估——在找到一个身份后,不要再为同一身份进行任何后续任务匹配。

    我想做一个EXISTS子查询,但我不知道这些子查询是如何优化的。我需要它首先加入任务表,在标识表之前,所以我没有对标识表进行完整扫描,因为标识表非常大,并且会有很多不匹配项。

    3 回复  |  直到 17 年前
        1
  •  1
  •   dkretz    17 年前

    在mysql中,只需使用“selectdistinct”就可以了。您可能需要将您的值放在一个表中并连接到它,而不是使用“in(…)”。

        2
  •  0
  •   1800 INFORMATION    17 年前

    MYSQL支持Topn语法吗?如果是:

    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)
    
        3
  •  0
  •   MBCook    17 年前

    我希望exists的性能会比join和groupby稍微好一点,但我必须尝试一下才能确定。我在MySQL中遇到了足够多的性能问题,我的预测是错误的,我认为值得尝试一下。