[英]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.