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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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を取得する