2017-07-10 23 views
0

大量のレコードを持つ本番データベースに少量のレコードを削除して実行する際に問題が発生しています。大規模なテーブルの少量のレコードで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。

  • 答えて

    0

    あなたは、インデックスを必要としてあなたはmemeberテーブルに複合インデックスがあることを確認してください。そして、あなたはmember(sub_id, id)member_child(member_id)にインデックスをしたい

    delete mc 
        from member_child mc join 
         member m 
         on mc.member_id = m.id and m.sub_id = xxx; 
    

    :私はこれを書くために傾けられます。

    +0

    インデックスの順序は重要ですか?メンバー(sub_id、id)はメンバー(id、sub_id)と同じですか? – shuttsy

    +0

    @shuttsy。 。 。どういたしまして。インデックスの順序は重要です。 –

    0

    は句

    に参加代わりのインナーを使用してみてくださいと(sub_idは、ID)

    delete from member_child mc 
    inner join member m1 on mc.member_id = m1.id and m1.sub_id = xxx 
    
    関連する問題