簡體   English   中英

提高性能的MySQL查詢

[英]Improve performance mySQL query

大家好,大家好

在高性能SQL查詢方面,我遠非專家,而且想知道任何人都可以幫助我改善下面的查詢。 它可以工作,但是花費的時間太長,特別是因為我在IN()部分可以包含100個左右的條目。

代碼如下,希望您能找出足夠的架構來提供幫助。

SELECT  inv.amount
FROM    invoice inv
WHERE   inv.invoiceID IN (
        SELECT  childInvoiceID
        FROM    invoiceRelation ir
                LEFT JOIN Payment pay ON pay.invoiceID = ir.parentInvoiceID
        WHERE   pay.paymentID IN ( 125886, 119293, 123497 ) )

重組查詢以使用聯接而不是子選擇。 另外,在付款表中使用INNER JOIN而不是LEFT JOIN。 這是有道理的,因為您有一個WHERE過濾器,該過濾器無論如何都要在Payment表中過濾不匹配的行。

SELECT inv.amount 
FROM invoice inv
INNER JOIN invoiceRelation ir ON inv.incoiceID = ir.childInvoiceID
INNER JOIN Payment pay on pay.invoiceID = ir.parentInvoiceID
WHERE pay.paymentID IN (...)

一種提高性能的方法是在相關列上具有良好的索引。 在您的示例中, inv.invoiceI上的索引可能會大大加快查詢速度。

也在pay.paymentID

試試看,看看是否有幫助:

ALTER TABLE invoice ADD INDEX invoiceID_idx (invoiceID);

ALTER TABLE Payment ADD INDEX paymendID_idx (paymentID);

我首先想到的,而不是in你可以使用內部連接。

select inv.amount from invoice inv 
inner join  invoiceRelation ir on (inv.invoiceID = ir.childInvoiceID)
LEFT JOIN Payment pay ON pay.invoiceID = ir.parentInvoiceID
WHERE pay.paymentID IN (125886,119293,123497)

如果您嘗試這樣操作,該怎么辦:

SELECT  inv.amount
FROM    invoice inv
inner join invoiceRelation ir on inv.invoiceID = ir.parentInvoiceID
left join Payment pay on pay.invoiceID = ir.parentInvoiceID 
WHERE  pay.paymentID IN ( 125886, 119293, 123497 )  

(或更好; 如果您確定付款表中有一個invoiceID FK,則使該left join聯接成為inner join聯接。

簡而言之,如果可以將子查詢替換為聯接,則應始終避免使用相關子查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM