Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQL初心者が311個のカラムにNot NULL制約を追加していってALTER TABLE...

MySQL初心者が311個のカラムにNot NULL制約を追加していってALTER TABLEについて学んだ話

Avatar for hatsu

hatsu

May 08, 2025
Tweet

More Decks by hatsu

Other Decks in Programming

Transcript

  1. 自己紹介 • Ruby歴 5年 = エンジニア歴 • SHE Inc. •

    React.js / TypeScript / GitHub Actions • Rubyが一番好き
  2. 技術スタック • Backend: Ruby, Ruby on Rails, GraphQL, Sidekiq •

    Frontend: React.js, TypeScript, Next.js • Database: MySQL 8.0 • CI: GitHub Actions • Infrastructure: Kubernetes
  3. validates :xxx, presence: trueだけあるカラムを探 す • active_record_doctor gemを使った • database_consistency

    gemもあるが、今回の例では active_record_doctorが使いやすかった • presence: trueがあるけどnot null制約がないとか • 外部キー制約が存在しないとかを検知してくれる • presence: trueだがnot null制約のないカラムが117テーブル / 311カラ ム発見された
  4. メタデータとは • テーブルの構造や定義に関する情報 のこと • カラム名やデータ型、制約(Not NULL, Primary Keyなど) •

    実際のレコード(データ)とは別物 • スキーマ変更時には、このメタデータにロックがかかることが多い • SELECT, INSERTなどのDMLでも共有メタデータロック がかかる • ALTER TABLE実行時の多くの場合、排他メタデータロック がかかる
  5. ALGORITHMの違い 特徴 INSTANT INPLACE COPY 主な用途 カラム追加(末尾)、デフォルト値変更(SET DEFAULT)など、メタデータのみの変更で済む操作 多くの一般的なALTER TABLE操作

    (カラムの追加・ 削除、インデックスの追加など) テーブル構造を大きく変更する場合 (データ型変更、文字セット変更 など) テーブル再構築 不要 不要だったり必要だったりする 必要 処理速度 非常に速い 中程度 遅い 排他的メタデータロック (非常に短時間取得する ) 準備および実行中に取得されない 操作の準備・実行フェーズで短時間取得される場合 がある 操作期間中、テーブル全体に排他 MDLを取得する