我在执行一个非常慢的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上)。
块引用