我有一个查询在我的网站,正在创建一个速度瓶颈。一个有经验的PHP/MySql开发人员看着这个查询,立即发现了问题,解释了一下应该如何优化它的结构,然后(不幸的是,很多web开发人员都发生过这种情况)立即消失了。
下面是有问题的查询:
SELECT DISTINCT a.id, a.title, a.thumb_image
FROM artwork a
LEFT JOIN galleries_artwork ga
ON a.id = ga.artwork_id
WHERE ga.galleries_id = $gallery_id
ORDER BY ga.position
他说,查询排序结果集的方式,需要3倍的时间,如果它被重写,放在开始[…]我不太记得他是怎么解释的了。
有没有人能从速度优化的角度看出这有什么问题,并解释一下,如何优化它?
多谢!
distinct
是一个主要问题。此外,由于where
子句,您正在将left join
转换为inner join
,因此这可能是您想要的:
SELECT a.id, a.title, a.thumb_image
FROM artwork a JOIN
galleries_artwork ga
ON a.id = ga.artwork_id
WHERE ga.galleries_id = $gallery_id
ORDER BY ga.position
galleries_artwork(galleryies_id, position, artwork_id)
和artwork(id, title, thumb_image)
上的索引对于这个版本的查询是最优的。