Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何优化这个MySQL查询?_Php_Mysql_Sql - Fatal编程技术网

Php 如何优化这个MySQL查询?

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

我正在按查询使用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 (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几乎肯定是不必要的!这就是说,从原始数据中导出此查询是一项令人印象深刻的壮举!