我有一个查询有一些子查询(内部选择),我试着找出哪个更好的性能,更大的查询或很多较小的查询,当我的服务器上的所有时间都发生变化时,我发现很难尝试和计算差异。MYSQL查询优化,多个查询或一个大型查询
我使用下面的查询一次返回10个结果,以使用分页(偏移和限制)在我的网站上显示。
SELECT adverts.*, breed.breed, breed.type, sellers.profile_name, sellers.logo, users.user_level ,
round(sqrt((((adverts.latitude - '51.558430') * (adverts.latitude - '51.558430')) * 69.1 * 69.1) + ((adverts.longitude - '-0.0069345') * (adverts.longitude - '-0.0069345') * 53 * 53)), 1) as distance,
(SELECT advert_images.image_name FROM advert_images WHERE advert_images.advert_id = adverts.advert_id AND advert_images.main = 1 LIMIT 1) as imagename,
(SELECT count(advert_images.advert_id) from advert_images WHERE advert_images.advert_id = adverts.advert_id) AS num_photos
FROM adverts
LEFT JOIN breed ON adverts.breed_id = breed.breed_id
LEFT JOIN sellers ON (adverts.user_id = sellers.user_id)
LEFT JOIN users ON (adverts.user_id = users.user_id)
WHERE (adverts.status = 1) AND (adverts.approved = 1)
AND (adverts.latitude BETWEEN 51.2692837281 AND 51.8475762719) AND (adverts.longitude BETWEEN -0.472015213613 AND 0.458146213613)
having (distance <= '20')
ORDER BY distance ASC
LIMIT 0,10
它会更好,从主查询中删除低于2个内选择,然后在我的PHP循环,调用2选择10次,一次在回路中的每个记录?
(SELECT advert_images.image_name FROM advert_images WHERE advert_images.advert_id = adverts.advert_id AND advert_images.main = 1 LIMIT 1) as imagename,
(SELECT count(advert_images.advert_id) from advert_images WHERE advert_images.advert_id = adverts.advert_id) AS num_photos
嗨,谢谢你的详细解答。我尝试了你提到的第一种方法,并删除内部选择,但查询比原始文件慢。临时表听起来不错,但是当查询在服务器上每秒钟运行约10次时,它可以正常工作,因为网站非常繁忙? – user1052096
@ user1052096,只要临时表方法的两个查询足够接近,应该没有什么影响。临时表是连接本地的,所以不会有任何名称冲突。与第二个查询结果的许多列相比,“tmp”表的内存消耗应该很小,所以组合的解决方案可能使用的内存少于原始查询。但我只是有另一个想法,我会立刻编辑成我的答案。 – MvG
嗨MvG,感谢您的更新使用子查询哪些工作,但我不知道它的更快。如果我只运行子查询,它会在0.02秒内运行,但是如果我运行子查询而不选择advert_id,它将以0.01的速度运行两次。 – user1052096