加入表非常慢我该如何解决?

时间:2014-02-03 03:29:32

标签: mysql

我的查询有问题,因为加入了很多表格。所以我想在这个查询旁边找到另一种方法但结果却一样。我的代码如下:

SELECT 
    tblReturn.CountryID, 
    tblReturn.ShopLocationId, 
    tblReturn.ReturnID, 
    tblVoucherDetail.VoucherDetailID,
    tblVoucherDetail.VoucherNo,
    tblVoucherDetail.BarcodeVoucher, 
    tblReturn.DateTimeStamp AS DateTimeReturn,
    tblClient.ClientNoString, 
    tblSaleDetail.BarCode, 
    tblReturnType.Description, 
    tblReturn.Reason, 
    tblSale.DateTimeStamp AS DateTimeSale,tblReturn.Status 
FROM 
(
    tblSale 
    INNER JOIN 
    (
        (
            (
                tblReturn 
                INNER JOIN 
                (
                     tblVoucherDetail 
                     INNER JOIN
                     tblVoucher ON tblVoucherDetail.VoucherID = tblVoucher.VoucherID
                ) ON tblReturn.ReturnID = tblVoucher.ReturnID
            ) 
            INNER JOIN 
                 tblClient 
            ON 
                 tblVoucherDetail.ClientNo = tblClient.ClientNo
        ) 
        INNER JOIN 
            tblSaleDetail 
        ON 
            tblReturn.SaleDetailIDOrigin = tblSaleDetail.SaleDetailID) 
        ON 
            (tblSale.SaleID = tblSaleDetail.SaleID) 
        AND 
            (tblSale.ShopLocationID = tblSaleDetail.ShopLocationID)) 
        INNER JOIN 
            tblReturnType 
        ON 
            tblReturn.ReturnTypeID = tblReturnType.ReturnTypeID
        WHERE 
            tblReturn.CountryID = 7 
        AND  
            tblReturn.ShopLocationID = 4   
       ORDER BY 
            tblVoucherDetail.VoucherDetailID DESC

我该如何调整?

2 个答案:

答案 0 :(得分:1)

使用说明和索引。 http://dev.mysql.com/doc/refman/5.0/en/explain.html。使用索引将使数据库能够优化搜索

答案 1 :(得分:0)

虽然优化您的查询是好的(索引是您的朋友),但您可以考虑使用此多个连接的另一种方法。对数据库进行“非规范化”并创建一个具有所需数据的表。这涉及在原始表和您创建的新“报告”表中更新数据。这有明显的缺点 - (1)使用的空间更多,(2)您必须编写代码以保持数据同步,或者您必须定期重建“报告”表,(3)微妙如果您的数据 不同步,则可能会发生错误。

然而,有时非规范化是解决令人讨厌的连接性能问题的最简单和最好的解决方案。