MySQL - 如何加速或更改此查询

时间:2013-12-31 16:28:13

标签: mysql sql

我没有写这个查询。我正在研究别人的旧代码。我正在考虑更改此查询所需的内容,但如果我可以简单地加快此查询,这将暂时解决我的问题。我正在寻找添加索引。当我做一个show index时,表上有这么多索引,这也会减慢查询的速度吗?

我不是数据库专家。我想我会从这项努力中学到更多。 :)

    SELECT 
        orders.ORD_ID,
        orders.ORD_TotalAmt,
        orders.PAYMETH_ID,
        orders.SCHOOL_ID,
        orders.ORD_AddedOn,
        orders.AMAZON_PurchaseDate,
        orders.ORDSTATUS_ID,
        orders.ORD_InvoiceNumber,
        orders.ORD_CustFirstName,
        orders.ORD_CustLastName,
        orders.AMAZON_ORD_ID,
        orders.ORD_TrackingNumber,
        orders.ORD_SHIPPINGCNTRY_ID,
        orders.AMAZON_IsExpedited,
        orders.ORD_ShippingStreet1,
        orders.ORD_ShippingStreet2,
        orders.ORD_ShippingCity,
        orders.ORD_ShippingStateProv,
        orders.ORD_ShippingZipPostalCode,
        orders.CUST_ID,
        orders.ORD_ShippingName,
        orders.AMAZON_ShipOption,
        orders.ORD_ShipLabelGenOn,
        orders.ORD_SHIPLABELGEN,
        orders.ORD_AddressVerified,
        orders.ORD_IsResidential,
        orderstatuses.ORDSTATUS_Name,
        paymentmethods.PAYMETH_Name,
        shippingoptions.SHIPOPT_Name,
        SUM(orderitems.ORDITEM_Qty) AS ORD_ItemCnt,
        SUM(orderitems.ORDITEM_Weight * orderitems.ORDITEM_Qty) AS ORD_ItemTotalWeight
    FROM 
        orders
        LEFT JOIN orderstatuses ON
            orders.ORDSTATUS_ID = orderstatuses.ORDSTATUS_ID
        LEFT JOIN orderitems ON
            orders.ORD_ID = orderitems.ORD_ID
        LEFT JOIN paymentmethods ON
            orders.PAYMETH_ID = paymentmethods.PAYMETH_ID
        LEFT JOIN shippingoptions ON
            orders.SHIPOPT_ID = shippingoptions.SHIPOPT_ID
    WHERE
            (orders.AMAZON_ORD_ID IS NOT NULL AND (orders.ORD_SHIPLABELGEN IS NULL OR orders.ORD_SHIPLABELGEN = '') AND orderstatuses.ORDSTATUS_ID <> 101 AND orderstatuses.ORDSTATUS_ID <> 40)
    GROUP BY
        orders.ORD_ID,
        orders.ORD_TotalAmt,
        orders.PAYMETH_ID,
        orders.SCHOOL_ID,
        orders.ORD_AddedOn,
        orders.ORDSTATUS_ID,
        orders.ORD_InvoiceNumber,
        orders.ORD_CustFirstName,
        orders.ORD_CustLastName,
        orderstatuses.ORDSTATUS_Name,
        paymentmethods.PAYMETH_Name,
        shippingoptions.SHIPOPT_Name
    ORDER BY
        orders.ORD_ID 

2 个答案:

答案 0 :(得分:0)

您应该考虑的一个简单的事情是,您是否真的需要使用左连接,或者您会对使用某些连接的内部连接感到满意。新查询与原始查询不同,因此您需要仔细考虑您真正想要的内容。如果您的外键关系被正确编入索引,这可能会有很大帮助,特别是在ORDERS和ORDERITEMS之间,因为我认为这些是您最大的表。以下帖子有一个很好的解释:INNER JOIN vs LEFT JOIN performance in SQL Server。还有很多其他事情可以做,但你需要发布查询计划,以便人们可以深入了解。

答案 1 :(得分:0)

看起来只需添加索引即可。

create index orderitems_ORD_ID_index on orderitems(ORD_ID);