大量のレコードを持つ本番データベースに少量のレコードを削除して実行する際に問題が発生しています。大規模なテーブルの少量のレコードでMySqlの削除が遅い
私のテーブルは以下のとおりです。
メンバー:8メートルの記録 'sub_idは' 欄に 'ID' 列
- インデックス
Member_child:62メートルの記録
- 'id' coluのインデックスMN
- 外部キー(デフォルト???によってインデックス)「MEMBER_ID」列に
私のアプリケーションはそのクエリを実行しようとすると、特定の提出(sub_idは)値のメンバーのすべての子レコードを削除する必要があります:
delete from member_child where member_id in (select m1.id from member m1 where m1.sub_id=xxx)
私の提出物は、子テーブルに約500レコードあります。
削除ステートメントは完了するまでに約6分かかりますが、これはユーザーエクスペリエンスが優れていません。
このクエリが実行中で、別のMySQL接続に接続し、 'show ENGINE INNODB ENGINE \ G;'を実行すると、クエリで5m +レコードのロックが作成されることがわかります。
---TRANSACTION 0 48901, ACTIVE 233 sec, process no 32526, OS thread id
139811386337024 starting index read, thread declared inside InnoDB 269
mysql tables in use 2, locked 2
488961 lock struct(s), heap size 47413232, 5052181 row lock(s)
MySQL thread id 2, query id 140 localhost iconnect preparing
delete from member_child where member_id in (select m1.id from
member m1 where m1.sub_id=12345)
私のインデックスは正しいと思います。他に何を試すことができますか?
これは、Linuxで動作するMySql v5.1.73です。
私の 'transaction-isolation'はREAD COMMITTEDです(ロックアウトタイムアウト例外で1つのクエリが失敗することなく、異なるサブミットの同時クエリを同時に実行できるようにデフォルトから変更する必要があります)、 'innodb_buffer_pool_size' = 1G。
インデックスの順序は重要ですか?メンバー(sub_id、id)はメンバー(id、sub_id)と同じですか? – shuttsy
@shuttsy。 。 。どういたしまして。インデックスの順序は重要です。 –