繁体   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