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
430
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MySQL初心者が311個のカラムにNot NULL制約を追加していってALTER TABLEについて学んだ話
hatsu
May 08, 2025
More Decks by hatsu
See All by hatsu
Prism.parseで 300本以上あるエンドポイントに 接続できる権限の一覧表を作ってみた
hatsu38
1
210
introduction_scriptor_gem.pdf
hatsu38
1
200
約9000個の自動テストの 時間を50分->10分に短縮 Flakyテストを1%以下に抑えた話
hatsu38
25
21k
Just a Rails Patch Update
hatsu38
2
1k
Dive into MaintenanceTasks
hatsu38
1
230
GitHub Actions is Fun
hatsu38
1
230
Other Decks in Programming
See All in Programming
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
380
What's New in Android 2026
veronikapj
0
260
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
590
Building a Meta Ray-Ban display app
akkeylab
0
160
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.3k
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
5
1.8k
Google Apps Script で Ruby を動かす
kawahara
0
260
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
690
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.8k
Go 1.27 における memory allocation の高速化
andpad
0
230
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
5
1.9k
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
570
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
210
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
370
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
240
Visualization
eitanlees
152
17k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
GraphQLとの向き合い方2022年版
quramy
50
15k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
250
A Modern Web Designer's Workflow
chriscoyier
698
190k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
470
Done Done
chrislema
186
16k
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実行時の多くの場合、排他メタデータロックかかる