大表索引付けスキーム


背景
企業ごとにデータベースの設計にシナリオがあります.最近、巡回検査表の設計で、更新時間フィールドに対するupdated_が漏れていることがわかりました.atのインデックスです.インデックスを追加する必要があります.
テーブルにインデックスを追加すると、テーブルがロックされることはよく知られています.うっかりすると、テーブルがロックされた後、業務が読み書きできなくなって事故の影響を及ぼす可能性があります.通常はWaiting for meta data lockと間違えて報告されています.テーブルを修正する際,特に生産上,まず対応するテーブルが高同時読み書き(操作タイミングの選択),テーブルのレベル情報であるかどうかを観察する.
イニシアチブ
全体的な考え方は次のとおりです.
  • まずテーブルを作成し、構造は元のテーブルと同じです.
  • 新しいテーブルにインデックスを追加します.
  • rename新しいテーブルは元のテーブルのテーブル名で、元のテーブルは新しい名前に変わります.
  • は元のテーブルにインデックスを追加します.
  • インデックスの作成に成功すると、rename元のテーブルが元の名前になり、新しいテーブルのデータが元のテーブルにインポートされます.
    SQLリファレンス:
    --            `fea_moni_res`
    -- 1.     `fea_moni_res`     
    CREATE TABLE fea_moni_res_tmp LIKE fea_moni_res;
    
    -- 2.        
    ALTER TABLE fea_moni_res_tmp ADD INDEX idx_index_name (col_name);
    
    -- 3. *rename*        ,       
    RENAME TABLE fea_moni_res TO fea_moni_res_1, fea_moni_res_tmp TO fea_moni_res;
    
    -- 4.        ,      
    ALTER TABLE fea_moni_res_1 ADD INDEX idx_index_name (col_name);
    
    -- 5.         ,rename        ,              
    RENAME TABLE fea_moni_res TO fea_moni_res_tmp, fea_moni_res_1 TO fea_moni_res;
    --                
    INSERT INTO fea_moni_res(col_name1, col_name2) SELECT col_name1, col_name2 FROM fea_moni_res_tmp;
    

    まとめ
    この文書では、大きなテーブルにインデックスを追加する方法を示します.もちろん、この案は完璧ではありません.例えば、ステップ3のrename操作後、ビジネスは履歴データに基づいて論理を判断する必要があるため、ビジネスに影響を及ぼす可能性が高い.この場合、ステップ2以降に、元のテーブルのデータを新しいテーブルに先にインポートし、完全にインポートしてから直接テーブルを切断しなければならない場合があります.これは,業務の場面から判断し,具体的な問題を具体的に分析する必要がある.
    ここでは、大きなテーブルにフィールドを追加したり、フィールドを削除したりするテーブルロック操作を参照できるシナリオにすぎません.