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