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以降、サブクエリ選択(クエリ内の別の完全選択ステートメント)は最適化できません。これがおそらくクエリが非常に遅い理由です。クエリをリファクタリングして、内部のselectステートメントを削除します。

 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 に答える