MySQL - 使用一个查询的结果在另一个查询中使用

11

假设我有以下代码,它可以生成50,000个行:

SELECT photoID FROM photoSearch WHERE photoID BETWEEN 1 AND 50000;

我打算对刚刚返回的那些照片ID运行这个查询。

SELECT COUNT(people) AS totalPeople, people
FROM people
INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID
WHERE photoid IN ('ID's from results')
GROUP BY people
ORDER BY totalPeople DESC

但是,我从其他人和资源中了解到,在有100,000个以上的photoID时,使用IN子句性能不佳。

将顶部查询的photoID存储在另一个表(resultsTbl)或非常长的字符串中是否是一个好主意?如果是,我应该使用连接还是子查询来查询这些ID(在底部查询中),而不是使用IN?或者...是否有其他方法可以在保持性能的前提下完成工作?

对此的任何帮助都将不胜感激。


在使用photoSearch.photoID进行连接并将where约束条件添加到第二个查询中是否存在问题? - Art Taylor
除了我需要分开结果之外。顶部查询生成用于显示照片的结果,我使用do while循环。第二个查询使用另一个do while循环,生成返回这些照片中所有人的列表。 - TheCarver
1个回答

20
  1. 将top查询中的photoID存储到另一个表(resultsTbl)或一个非常长的字符串中,这是个好主意吗?

    • 存储在另一个表中:通常不需要。如果有很多ID,并且您在其他地方执行了顶部查询,则将其存储在缓存表中可能是可以接受的。但是,在此情况下,“顶部查询”很可能会保留在内存中,因此您应该使用子查询。

    • 存储在非常长的字符串中:不行。字符串操作通常需要大量CPU资源。

  2. 如果回答是肯定的,那么我在底层查询中是否应该使用连接或子查询来查询这些ID,而不是使用IN?

    • 不要将其存储在临时表中,最好一开始就使用JOIN(请参见以下示例)。 在某些情况下,数据库将为您联接IN(select * from foo)

  • 使用IN(子查询):

SELECT     count(people) AS totalPeople
         , people
FROM       people
INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID
WHERE      photoid IN (select  photoID 
                       from    photoSearch 
                       where   photoID 
                       between 1 AND 50000)
GROUP BY   people
ORDER BY   totalPeople DESC
  • 使用JOIN

    SELECT     count(people) AS totalPeople
             , people
    FROM       people
    INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID
    INNER JOIN photoSearch ON photopeople.photoid  = photoSearch.photoID
    WHERE      photoID between 1 AND 50000
    GROUP BY   people
    ORDER BY   totalPeople DESC
    

  • 3
    好的,你可以添加“EXISTS”版本。 - ypercubeᵀᴹ
    哇,@ypercube,非常感谢您的建议。我刚刚尝试了“使用IN(子查询)”的建议,但处理时间太长了。我的实际查询本身就需要1秒才能返回结果。在您的建议中,我基本上正在执行另一个相同的搜索,这现在使它变成了2+秒。一定有更快的方法,因为当我想要添加关键字和事件查询时,它将需要近5秒! - TheCarver
    我现在考虑将结果存储起来,这样我就可以在人员查询、关键词查询和事件查询中使用它们了……你同意吗? - TheCarver
    如果您尝试使用JOIN,请使用count(*)而不是count(people) - ypercubeᵀᴹ
    好的,我已经解决了这个问题,它可以从名为searchPhotoResults的表中获取搜索结果,但需要15秒才能返回!SELECT COUNT(*) AS totalPeople, people FROM people INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID INNER JOIN searchPhotoResults ON photopeople.photoid = searchPhotoResults.photoID GROUP BY people ORDER BY totalPeople DESC LIMIT 5 - TheCarver
    显示剩余4条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接