Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MySQL初心者が311個のカラムにNot NULL制約を追加していってALTER TABLE...
Search
hatsu
May 08, 2025
Programming
2
380
MySQL初心者が311個のカラムにNot NULL制約を追加していってALTER TABLEについて学んだ話
hatsu
May 08, 2025
Tweet
Share
More Decks by hatsu
See All by hatsu
Prism.parseで 300本以上あるエンドポイントに 接続できる権限の一覧表を作ってみた
hatsu38
1
180
introduction_scriptor_gem.pdf
hatsu38
1
180
約9000個の自動テストの 時間を50分->10分に短縮 Flakyテストを1%以下に抑えた話
hatsu38
25
19k
Just a Rails Patch Update
hatsu38
2
900
Dive into MaintenanceTasks
hatsu38
1
210
GitHub Actions is Fun
hatsu38
1
200
Other Decks in Programming
See All in Programming
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
200
JPUG勉強会 OSSデータベースの内部構造を理解しよう
oga5
2
230
AIに仕事を丸投げしたら、本当に楽になれるのか
dip_tech
PRO
0
180
Ruby x Terminal
a_matsuda
5
570
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
180
CSC307 Lecture 12
javiergs
PRO
0
450
手戻りゼロ? Spec Driven Developmentとは@KAG AI week
tmhirai
1
150
今更考える「単一責任原則」 / Thinking about the Single Responsibility Principle
tooppoo
3
1.3k
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
240
PostgreSQL を使った快適な go test 環境を求めて
otakakot
0
390
エージェント開発初心者の僕がエージェントを作った話と今後やりたいこと
thasu0123
0
230
並行開発のためのコードレビュー
miyukiw
2
2.2k
Featured
See All Featured
4 Signs Your Business is Dying
shpigford
187
22k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
WCS-LA-2024
lcolladotor
0
470
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Prompt Engineering for Job Search
mfonobong
0
180
Being A Developer After 40
akosma
91
590k
Scaling GitHub
holman
464
140k
HDC tutorial
michielstock
1
490
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
460
A Soul's Torment
seathinner
5
2.4k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
240
Transcript
MySQL初心者が311個のカラムに Not NULL制 約を追加していって ALTER TABLEについて学 んだ話 Roppongi.rb #30 @hatsu_38
2025/05/08
自己紹介 • Ruby歴 5年 = エンジニア歴 • SHE Inc. •
React.js / TypeScript / GitHub Actions • Rubyが一番好き
技術スタック • Backend: Ruby, Ruby on Rails, GraphQL, Sidekiq •
Frontend: React.js, TypeScript, Next.js • Database: MySQL 8.0 • CI: GitHub Actions • Infrastructure: Kubernetes
Validationのpresence: ture しかないnullableが多くあった 💭
Validationだけではnullを防げない
Validationだけではnullを防げない
validates :xxx, presence: trueだけあるカラムを探 す • active_record_doctor gemを使った • database_consistency
gemもあるが、今回の例では active_record_doctorが使いやすかった • presence: trueがあるけどnot null制約がないとか • 外部キー制約が存在しないとかを検知してくれる • presence: trueだがnot null制約のないカラムが117テーブル / 311カラ ム発見された
Not NULL制約を追加していく 🚀
MySQL 8.0.32 - REPEATABLE-READ
オンライン DDLがあるとはいえ、 本番運用中のテーブルに Not NULL制約追加しても影響がでないか? 🤔
MySQL 8.0 生成されたカラム操作のオンライン DDL サポート https://dev.mysql.com/doc/refman/8.0/ja/innodb-online-ddl-operations.html#online-ddl-column-operations
メタデータとは • テーブルの構造や定義に関する情報 のこと • カラム名やデータ型、制約(Not NULL, Primary Keyなど) •
実際のレコード(データ)とは別物 • スキーマ変更時には、このメタデータにロックがかかることが多い • SELECT, INSERTなどのDMLでも共有メタデータロック がかかる • ALTER TABLE実行時の多くの場合、排他メタデータロック がかかる
共有MDLと排他MDL 排他MDL中は、他のMDLは動かせない 共有MDL 排他MDL 共有MDL ♻競合しない 💥競合する 排他MDL 💥競合する 💥競合する
MySQL 8.0 生成されたカラム操作のオンライン DDL サポート https://dev.mysql.com/doc/refman/8.0/ja/innodb-online-ddl-operations.html#online-ddl-column-operations
ALGORITHMの違い 特徴 INSTANT INPLACE COPY 主な用途 カラム追加(末尾)、デフォルト値変更(SET DEFAULT)など、メタデータのみの変更で済む操作 多くの一般的なALTER TABLE操作
(カラムの追加・ 削除、インデックスの追加など) テーブル構造を大きく変更する場合 (データ型変更、文字セット変更 など) テーブル再構築 不要 不要だったり必要だったりする 必要 処理速度 非常に速い 中程度 遅い 排他的メタデータロック (非常に短時間取得する ) 準備および実行中に取得されない 操作の準備・実行フェーズで短時間取得される場合 がある 操作期間中、テーブル全体に排他 MDLを取得する
ALGORITHM=INPLACEの実行時の 3ステップ 1. 初期化: ALGORITHMの決定(共有メタデータロックを取 得する) 2. 実行: テーブルのコピーなどの実行(実行直後は排他メ タデータロックを取得。解放後共有メタデータロックに
なる) 3. コミット: DDLコミット(実行直後は排他メタデータロック を取得し、コミットする)
ロック時間の注意ポイント 🔐
注意1 t1テーブルへの ALTER TABLE実行前に 別のセッションで t1テーブルへの DML が走って共有メタデータロックが取得されている場合
注意2: t1テーブルへの ALTER TABLE実行中(DDLコミット前 )に 別のセッションで t1で DMLが走って共有メタデータロックが取得されている場合
注意3 セッション Aでトランザクションが走るが t2テーブルの DMLしかない→セッション 2 でt1テーブルの DDL走る→セッション Aのトランザクションで t2テーブルの
DMLが 実行された場合
ALTER TABLE実行時間⏰
None
おわりに 1. 次は外部キー制約入ってない箇所をやっていきたい 2. でも外部キー制約の追加は ALGORITHM=COPYになりそうで大変な気が... 3. ActiveRecordDoctor gemだと偽陽性の検知が多かったので直すPRを出してい ます
4. ALTER TABLE実行時の多くの場合、排他メタデータロックかかる