4

テーブルから行を削除しようとすると、これらのエラーが発生し続けます。ここでの特別なケースは、同時に 5 つのプロセスを実行している可能性があることです。

テーブル自体は、最大 450 万行の Innodb テーブルです。WHERE 句で使用されている列にインデックスがありません。他の指標は想定どおりに機能しています。

これはトランザクション内で行われます。最初にレコードを削除し、次に置換レコードを挿入します。すべてのレコードが挿入された場合にのみ、トランザクションをコミットする必要があります。

エラーメッセージ:

クエリ エラー: ロック待機タイムアウトを超えました。DELETE FROM tablename WHERE column=value の実行中にトランザクションを再開してみてください

ここで参照列にインデックスを作成すると役に立ちますか? 行を明示的にロックする必要がありますか?

質問#64653でいくつかの追加情報を見つけましたが、それが私の状況を完全にカバーしているとは思いません。

エラーの原因が DELETE ステートメントであることは確かですか、それともクエリ内の他のステートメントである可能性がありますか? DELETE ステートメントは最初のステートメントなので、論理的に見えますが、よくわかりません。

4

2 に答える 2

3

インデックスは間違いなく役立ちます。削除されたレコードを置き換えようとしている場合は、可能であればクエリを変更して、DELETE の後に INSERT を実行するのではなく、更新を使用することをお勧めします。

INSERT INTO tableName SET
column2 = 'value2'
WHERE column = value
ON DUPLICATE KEY UPDATE
column2 = 'value2'
于 2009-12-07T13:27:54.400 に答える
1

インデックスは間違いなく役に立ちます。私はかつて、ユーザーデータを含む DB で作業しました。Web フロント エンドとユーザーの削除に問題が発生することがありました。日中は問題なく動作しました(ただし、かなり時間がかかりました)。しかし、午後遅くには、DB サーバーが 1 日の終わりの処理により負荷がかかったため、タイムアウトになることがありました。影響を受けた列のインデックスを叩くと、それ以降はすべてがスムーズに実行されました。

于 2009-12-07T13:33:58.367 に答える