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
200
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
120
introduction_scriptor_gem.pdf
hatsu38
1
130
約9000個の自動テストの 時間を50分->10分に短縮 Flakyテストを1%以下に抑えた話
hatsu38
24
17k
Just a Rails Patch Update
hatsu38
2
750
Dive into MaintenanceTasks
hatsu38
1
150
GitHub Actions is Fun
hatsu38
1
170
Other Decks in Programming
See All in Programming
dbt民主化とLLMによる開発ブースト ~ AI Readyな分析サイクルを目指して ~
yoshyum
3
1.1k
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
790
The Niche of CDK Grant オブジェクトって何者?/the-niche-of-cdk-what-isgrant-object
hassaku63
1
590
テストから始めるAgentic Coding 〜Claude Codeと共に行うTDD〜 / Agentic Coding starts with testing
rkaga
15
5.5k
MCPを使ってイベントソーシングのAIコーディングを効率化する / Streamlining Event Sourcing AI Coding with MCP
tomohisa
0
170
商品比較サービス「マイベスト」における パーソナライズレコメンドの第一歩
ucchiii43
0
160
Git Sync を超える!OSS で実現する CDK Pull 型デプロイ / Deploying CDK with PipeCD in Pull-style
tkikuc
4
330
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
mickey_kubo
1
240
AIエージェントはこう育てる - GitHub Copilot Agentとチームの共進化サイクル
koboriakira
0
730
Model Pollution
hschwentner
1
160
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
2
660
スタートアップの急成長を支えるプラットフォームエンジニアリングと組織戦略
sutochin26
1
7.1k
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.7k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
750
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
108
19k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Making Projects Easy
brettharned
116
6.3k
The Invisible Side of Design
smashingmag
301
51k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
282
13k
Navigating Team Friction
lara
187
15k
A designer walks into a library…
pauljervisheath
207
24k
Visualization
eitanlees
146
16k
Facilitating Awesome Meetings
lara
54
6.5k
Done Done
chrislema
184
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実行時の多くの場合、排他メタデータロックかかる