请考虑以下查询:
SELECT A.*,
GROUP_CONCAT(DISTINCT CONCAT(I.Image, '@', I.Local, '@', I.Primary) SEPARATOR ',') AS _Images,
GROUP_CONCAT(DISTINCT H.LocationId SEPARATOR ',') AS _Hierarchy,
GROUP_CONCAT(DISTINCT Am.AmenityId SEPARATOR ',') AS _Amenities
FROM Ads as A
LEFT JOIN ImagesTable as I ON I.AdId = A.AdId
LEFT JOIN HierarchyTable as H ON H.AdId = A.AdId
LEFT JOIN AmenitiesTable as Am ON Am.AdId = A.AdId
WHERE A.AdId IN (1,2,3,4,5,6,7,8,9,10)
GROUP BY A.AdId
假设表
Ads
有约1000000行。当使用MySQL运行此查询时,MySQL会如何处理该查询?
它会在表Ads
的~1000000行上处理JOIN操作吗?还是只在查询末尾提供的特定ID上处理它?
在where子句中指定200行时,像这样的查询对我来说需要大约0.9秒,我正在尝试加快它的速度。这就是为什么我想知道是否有任何方法可以加快此查询,例如通过告诉MySQL仅处理所需的行,而不是整个表Ads
。
WHERE A.AdId IN ...
和连接只会访问所需的行(因此特别是对于您的ads
表,它将仅访问具有A.AdId IN (1,2,3,4,5,6,7,8,9,10)
的行)-如果您在表上有正确的索引。如果没有添加您的explain
输出和至少使用的索引的索引定义,则由您决定它们是否正确。在Ads
中,每个AId
是否有多于1行?如果您的其他表很小,那么10行不应该需要1秒钟。顺便说一句:使用GROUP BY A.AdId
的select A.*
可能无法给您预期的结果。 - Solarflare