Php 如何优化这个MySQL查询?
我正在按查询使用join plus union plus组,我开发了一个查询,如下所述:Php 如何优化这个MySQL查询?,php,mysql,sql,Php,Mysql,Sql,我正在按查询使用join plus union plus组,我开发了一个查询,如下所述: SELECT * FROM ( (SELECT countries_listing.id, countries_listing.country, 1 AS is_country FROM countries_listing LEFT JOIN product_prices ON (produc
SELECT *
FROM (
(SELECT countries_listing.id,
countries_listing.country,
1 AS is_country
FROM countries_listing
LEFT JOIN product_prices ON (product_prices.country_id = countries_listing.id)
WHERE countries_listing.status = 'Yes'
AND product_prices.product_id = '3521')
UNION
(SELECT countries_listing.id,
countries_listing.country,
0 AS is_country
FROM countries_listing
WHERE countries_listing.id NOT IN
(SELECT country_id
FROM product_prices
WHERE product_id='3521')
AND countries_listing.status='Yes')) AS partss
GROUP BY id
ORDER BY country
我刚刚意识到这个查询需要花费大量的时间来加载结果,大约8秒
我想知道是否有可能将此查询优化为最快的查询?根据执行频率,准备好的语句可能会有所帮助。有关更多信息,请参阅。如果我正确理解了逻辑,您只需要为国家添加一个标志,说明给定产品是否有价格。我认为您可以使用
exists
子句来获得您想要的:
SELECT cl.id, cl.country,
(exists (SELECT 1
FROM product_prices pp
WHERE pp.country_id = cl.id AND
pp.product_id = '3521'
)
) as is_country
FROM countries_listing cl
WHERE cl.status = 'Yes'
ORDER BY country;
对于性能,您需要两个索引:countries\u列表(状态,国家)
和
product\u prices(country\u id,product\u id)`。确保您的表已编制索引,并且可以使用LIMIT X\u number来限制找到的结果数量。但我确信还有其他解决方案。这个问题似乎离题了,因为它是关于检查工作查询的,因此更适合。使用EXPLAIN
查看哪些索引被命中。我注意到第一个内部查询使用了一个连接
,而第二个没有,为什么?你也可以将它发布在See@Mihai的查询格式中-如果你可以用这种方式提问,它会非常有帮助,并减少了编辑工作。感谢您分享这么好的想法,但我还需要选择产品价格表中不存在的国家行。请帮帮我。谢谢是的,伙计,它工作得很好,我只是对这个问题感到惊讶和怀疑。非常感谢dude。请注意,相关子查询并不是特别以快速著称,引用产品id几乎肯定是不必要的!这就是说,从原始数据中导出此查询是一项令人印象深刻的壮举!