【发布时间】:2018-05-17 18:46:08
【问题描述】:
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
");
编辑:
根据 Mr.Alvaro 的建议,我已经更改了 SELECT *,它具有更高效的 SELECT [值列表],并且执行时间从 20 秒下降到 14 秒。还是太慢了...
END EDIT
每个产品可以有不同的价格,所以我使用 (select max...) 来获取最近(但不是未来)的价格。 也许这个功能会减慢一切?您认为有更好的解决方案吗?
考虑到相同的查询没有与价格的联接只需要 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) |
+----------------+-------------+
【问题讨论】:
-
哪个数据库+版本?如果我没记错的话,MySQL 5.5.21 和 5.6.4 之间有显着的性能提升。
-
我认为
WHERE $tb_prices.price_validity<=DATE_ADD(CURDATE(), INTERVAL +0 DAY)行正在放慢速度,因为它需要为每一行计算这一点。或者您可能需要向表中添加一些索引 -
PHP:5.6.30 - MySql:5.6.38
-
仅用于使用@Phate01 建议的测试目的,自行运行此查询并检查时间。 SELECT MAX($tb_prices.price_validity) FROM $tb_prices WHERE $tb_prices.price_validity
-
如果我使用 SELECT MAX() 查询不起作用.. 但如果我只使用 SELECT $tb_prices.price_validity ..... 它需要 0.006 秒。显然这个查询只读取 1 个产品
标签: php mysql performance