Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
MySQL初心者が311個のカラムにNot NULL制約を追加していってALTER TABLE...
Search
hatsu
May 08, 2025
Programming
450
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
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
410
active って名前で誤魔化すな / DON'T JUST CALL IT "ACTIVE"
hatsu38
0
120
Prism.parseで 300本以上あるエンドポイントに 接続できる権限の一覧表を作ってみた
hatsu38
1
220
introduction_scriptor_gem.pdf
hatsu38
1
210
約9000個の自動テストの 時間を50分->10分に短縮 Flakyテストを1%以下に抑えた話
hatsu38
25
21k
Just a Rails Patch Update
hatsu38
2
1k
Dive into MaintenanceTasks
hatsu38
1
240
GitHub Actions is Fun
hatsu38
1
240
Other Decks in Programming
See All in Programming
App Intentsのビルドプロセスを支える技術
kntkymt
0
450
The Good Stuff, Not the Slop: Engineering High-Quality Android Apps with Modern AI Tooling
danybony
1
260
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
960
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
100
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
4k
Are APIs Still Relevant in the AI Era?
soyuka
0
320
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.4k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
370
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
450
IBM Bob Dojo #1 仕様駆動開発入門
oniak3ibm
PRO
0
280
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
390
AI活用は、個人から組織へ|マルチプレイヤーエージェントハーネス「QM」の社内活用事例 / AI use is moving from individuals to orgs
rkaga
1
260
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
390
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
We Are The Robots
honzajavorek
0
380
Statistics for Hackers
jakevdp
799
230k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
How to Talk to Developers About Accessibility
jct
2
560
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Darren the Foodie - Storyboard
khoart
PRO
4
4k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
2.9k
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実行時の多くの場合、排他メタデータロックかかる