mysql - 如何优化这个嵌套的 SQL 查询

标签 mysql query-optimization sql-optimization

这是数据库架构:

[已编辑]

我将描述我对下面的查询所做的事情:

最内层查询:选择所有满足WHERE条件的saleId

中间查询:选择属于 saleId 一部分的所有 productId

最外层查询:SUM products.cost 并选择vendors.name

这是我想出的 SQL 查询:

SELECT vendors.name AS Company
, SUM(products.cost) AS Revenue
FROM
    products
    INNER JOIN sold_products
        ON (products.productId = sold_products.productId)
    INNER JOIN vendors
    ON (products.vendorId = vendors.vendorId)
            WHERE sold_products.productId IN (
                    SELECT sold_products.productId
                    FROM
                        sold_products
                    WHERE sold_products.saleId IN (
                            SELECT sales.saleId     
                            FROM
                                markets
                                INNER JOIN vendors
                                ON (markets.vendorId = vendors.vendorId)
                                INNER JOIN sales_campaign
                                ON (sales_campaign.marketId = markets.marketId)
                                INNER JOIN packet_headers
                                ON (sales_campaign.packetHeaderId = packet_headers.packetHeaderId)
                                INNER JOIN packet_details
                                ON (packet_details.packetHeaderId = packet_headers.packetHeaderId)
                                INNER JOIN sales
                                ON (sales.packetDetailsId = packet_details.packetDetailsId)
                            WHERE vendors.customerId=60
                            )
                    )
GROUP BY Company
ORDER BY Revenue DESC;

对优化有什么帮助吗?

最佳答案

由于您只是使用内部联接,因此通常将查询简化为如下所示:

SELECT  ve.name     AS Company
,       SUM(pr.cost) AS Revenue
FROM    products        pr
,       sold_products   sp
,       vendors         ve
,       markets         ma
,       sales_campaign  sc
,       packet_headers  ph
,       packet_details  pd
,       sales           sa
Where pr.productId = sp.productId
And   pr.vendorId  = ve.vendorId
And   ve.vendorId  = ma.vendorId
And   sc.marketId = ma.marketId
And   sc.packetHeaderId = ph.packetHeaderId
And   pd.packetHeaderId = ph.packetHeaderId)
And   sa.packetDetailsId = pd.packetDetailsId
And   ve.customerId = 60
GROUP BY ve.Company
ORDER BY pr.Revenue DESC;

请尝试一下这是否有效,如果速度更快,请告诉我。

关于mysql - 如何优化这个嵌套的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331355/

相关文章:

sql - PostgreSQL/SQL 查询优化

MySQL JOIN 查询花费太长时间才能完成

sql - 优化 IN 子句

php - 根据另一个表中的关联字符串查询和排序以分号分隔的 id 列表的最有效方法是什么?

mysql - 如何通过 Active Record 查询接口(interface)编写 sql 请求并连接两个表 where condition - array of ids

sql-server - SQL Server 存储过程 - 'IF statement' 与 'Where criteria'

mysql - 优化报告的 SQL 查询

mysql - 如何避免在 MySQL 中创建 tmp 表花费时间

mysql - mysql如何向多个表中插入数据

javascript - this._callback.apply 不是函数! Node js Mysql错误