我在执行一个非常慢的MySql查询时遇到了一个大问题。。太慢了。。。无法使用!
阅读1000种产品的价格需要20秒以上!!!

$dati = mysqli_query($mysqli_connect, "
SELECT      *
FROM        $tb_products
LEFT JOIN   $tb_categories ON $tb_products.product_category = $tb_categories.category_id_master
LEFT JOIN   $tb_subcategories ON $tb_products.product_subcategory = $tb_subcategories.subcategory_id_master
LEFT JOIN   $tb_logos ON $tb_products.product_logo = $tb_logos.logo_id_master

LEFT JOIN   $tb_prices ON (
            $tb_products.product_brand = $tb_prices.price_brand
            AND $tb_products.product_code = $tb_prices.price_code
            AND $tb_prices.price_validity = (
                SELECT  MAX($tb_prices.price_validity)
                FROM    $tb_prices
                WHERE   $tb_prices.price_validity<=DATE_ADD(CURDATE(), INTERVAL +0 DAY)
                        AND $tb_products.product_code = $tb_prices.price_code
            )
        )

WHERE       $tb_products.product_language='$activeLanguage' AND $tb_products.product_category!=0
GROUP BY    $tb_products.product_code
ORDER BY    $tb_products.product_brand, $tb_categories.category_rank, $tb_subcategories.subcategory_rank, $tb_products.product_subcategory, $tb_products.product_rank
");

编辑:
正如阿尔瓦罗先生所建议的那样,我已经改变了SELECT*选项,它有一个更高效的SELECT[值列表],执行时间从20秒减少到14秒。还是太慢了。。。
结束编辑
每个产品都有不同的价格,所以我使用(选择最大…)来获取最新(但不是未来)的价格。
也许是这个功能减缓了一切?你认为有更好的解决办法吗?
假设没有连接的同一个查询只需要0.2秒。
所以我确信问题就在代码的那一部分。
$dati = mysqli_query($mysqli_connect, "
SELECT      *
FROM        $tb_products
LEFT JOIN   $tb_categories ON $tb_products.product_category = $tb_categories.category_id_master
LEFT JOIN   $tb_subcategories ON $tb_products.product_subcategory = $tb_subcategories.subcategory_id_master
LEFT JOIN   $tb_logos ON $tb_products.product_logo = $tb_logos.logo_id_master

WHERE       $tb_products.product_language='$activeLanguage' AND $tb_products.product_category!=0
GROUP BY    $tb_products.product_code
ORDER BY    $tb_products.product_brand, $tb_categories.category_rank, $tb_subcategories.subcategory_rank, $tb_products.product_subcategory, $tb_products.product_rank
");

我还考虑了这样一个事实,即它可能取决于服务器的能力,但我倾向于排除它,因为第二个查询(没有价格)作为速度是可以接受的。
价格表如下
+----------------+-------------+
| price_id       | int(3)      |
| price_brand    | varchar(5)  |
| price_code     | varchar(50) |
| price_value    | float(10,2) |
| price_validity | date        |
| price_language | varchar(2)  |
+----------------+-------------+

最佳答案

可能是因为你在使用SELECT*,这被称为坏习惯。在堆栈溢出中检查此问题。
Is there a difference between Select * and Select [list each col]
在那里,米奇麦子写道:
您应该指定一个显式列列表。选择*将返回更多的列比您需要创建更多的IO和网络流量,但更重要的是,它可能需要额外的查找,即使存在非聚集覆盖索引(在SQL Server上)。
块引用

07-27 13:21
查看更多