3

下面的查询不断超时,是否有一种开销较小的方法来实现相同的功能?

UPDATE Invoices SET ispaid = 0 
WHERE Invoice_number IN (SELECT invoice_number
    FROM payment_allocation
    WHERE transactionID=305)

我正在做的是从交易中取消分配发票,最多可以返回 30 多条记录,但每次我尝试运行它时它都会停止数据库死机

4

4 回答 4

6

使用JOIN而不是子查询将提高性能。

如果您尚未创建,请在两个表中的Invoice_number列上创建索引。

尝试这个:

UPDATE Invoices i 
INNER JOIN payment_allocation pa ON i.Invoice_number = pa.invoice_number 
SET i.ispaid = 0 
WHERE pa.transactionID = 305;
于 2013-01-17T16:05:35.753 回答
2

我会尝试EXISTS

UPDATE Invoices a set ispaid=0 
WHERE EXISTS 
(
 SELECT NULL FROM payment_allocation b 
 WHERE b.Invoice_number =a.Invoice_number AND b.transactionID=305
)
于 2013-01-17T16:07:09.297 回答
1

从 MySQL 5.5 开始,无法优化子查询选择(查询中的另一个完整选择语句)。这可能就是您的查询如此缓慢的原因。重构您的查询以摆脱内部选择语句。

 UPDATE Invoices, payment_allocation
  SET ispaid=0 
  WHERE payment_allocation.transactionID=305 AND       
        Invoices.Invoice_number = payment_allocation.invoice_number 

一个有趣的旁注......但是 MariaDB(原始创建者的 MySQL 的一个分支)已经实现了子查询选择优化。

于 2013-01-17T16:04:25.943 回答
0
UPDATE invoices i
  JOIN payment_allocation pa
    ON pa.invoice_number = i.invoice_number
   SET i.ispaid=0 
 WHERE pa.transactionID = 305;
于 2013-01-17T16:07:40.233 回答