php - 如何让 Mysql 查询(多连接)更快更高效

标签 php mysql performance

我在执行一个非常慢的 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 秒。还是太慢了...
结束编辑

每个产品可以有不同的价格,所以我使用 (select max...) 来获取最近(但不是 future )的价格。 也许这个功能会减慢一切?您认为有更好的解决方案吗?

考虑一下,没有加入价格的同一个查询只需要 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]

在那里,Mitch Wheat 写道:

You should specify an explicit column list. SELECT * will bring back more columns than you need creating more IO and network traffic, but more importantly it might require extra lookups even though a non-clustered covering index exists (On SQL Server). Blockquote

关于php - 如何让 Mysql 查询(多连接)更快更高效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47631051/

相关文章:

php - 我想将两个不同的表行值插入到单个表中,

php 转 json 组数组

c# - 一个连接执行多条sql命令好,还是每次都重新连接好?

javascript - 如何在没有确认页面的情况下提交Google表单数据?

javascript - 通过单击按钮获取当前行

javascript - 如何使用 html 和 javascript 获取和传递链接参数

mysql - 如何修复损坏的 xampp 'mysql.user' 表?

mysql - Amazon RDS 无法执行 SET GLOBAL 命令

performance - Elasticsearch:最佳性能的过滤器顺序

python - 在 C/Java 中处理正则表达式的速度比在 Python 中快多少?