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
外部キー制約を持つテーブルに対する DDL の MDL を観察してみた
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yoshikai
July 05, 2025
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
外部キー制約を持つテーブルに対する DDL の MDL を観察してみた
yoshikai
July 05, 2025
More Decks by yoshikai
See All by yoshikai
DBA 1年目で勉強になった DDL 3選
yoshikai
0
130
Featured
See All Featured
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
710
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
440
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
How to Talk to Developers About Accessibility
jct
2
580
Documentation Writing (for coders)
carmenintech
77
5.6k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
How GitHub (no longer) Works
holman
316
150k
Transcript
外部キー制約を持つテーブルに対する DDL の MDL を観察してみた MySQL アンカンファレンス #9, 2025/07/08 yoshikai
こんばんは!初めての発表です • yoshikai • 新卒2年目 • DBA 歴ちょうど1年 • 昨年の今頃
MySQL 徹底入門 第4版 を 読み始めたくらい • 関連リンク • X • ブログ • (この内容で1つ目を書きました)
なんで観察しようと思った? • “外部キー制約を持っているテーブルに SELECT するとそのテーブルの親 テーブルにもメタデータロック (MDL) を置く” と思っていた •
参考:https://yoku0825.blogspot.com/2020/08/mysql-80-vs-vs-alter-table.html • 子テーブル A に SELECT が走っているときに新しく子テーブル B を 作成しようとすると親テーブルの MDL 待ちになると考えていた SELECT * FROM 子A CREATE TABLE 子B 親
なんで観察しようと思った? • CREATE TABLE 子B すると作成できた!? • 思っていた挙動と違う、、? SELECT *
FROM 子A CREATE TABLE 子B 親
メタデータロック (MDL) とは • 主にテーブル定義を保護するために置かれるデータに依存しないロック • テーブルの実データサイズなどには影響を受けない • 共有ロックと排他ロックあり •
トランザクション中にテーブルの構造が変更されることを防ぐ
観察してみたこと • CREATE TABLE • 子テーブル B を作成 • 子テーブル
A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • ALTER TABLE • 親テーブルに ALTER TABLE • 子テーブル A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • 子テーブル A に ALTER TABLE • 親テーブルに SELECT が走っている場合 • 親テーブルに INSERT が走っている場合 子A 子B 親
観察準備 p: 親 c: 子A
観察してみたこと • CREATE TABLE • 子テーブル B を作成 • 子テーブル
A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • ALTER TABLE • 親テーブルに ALTER TABLE • 子テーブル A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • 子テーブル A に ALTER TABLE • 親テーブルに SELECT が走っている場合 • 親テーブルに INSERT が走っている場合 子A 子B 親
CREATE TABLE – 子テーブル B を作成する (1) • 子テーブル A
に SELECT が走っている場合 • 子テーブル A の SHARED_READ がとられる • CREATE TABLE 子B は成功する SHARED_READ SELECT * FROM 子A CREATE TABLE 子B 親
CREATE TABLE – 子テーブル B を作成する (1) • 子テーブル A
に SELECT が走っている場合 • 子テーブル A の SHARED_READ がとられる • CREATE TABLE 子B は成功する SHARED_READ Succeeded! SELECT * FROM 子A CREATE TABLE 子B 親
CREATE TABLE – 子テーブル B を作成する (2) • 子テーブル A
に INSERT が走っている場合 • 子テーブル A の SHARED_WRITE, 親テーブルの SHARED_READ がとられる • CREATE TABLE 子B の親テーブルに対する EXCLUSIVE が待たされる SHARED_WRITE INSERT INTO 子A … SHARED_READ CREATE TABLE 子B 親
CREATE TABLE – 子テーブル B を作成する (2) • 子テーブル A
に INSERT が走っている場合 • 子テーブル A の SHARED_WRITE, 親テーブルの SHARED_READ がとられる • CREATE TABLE 子B の親テーブルに対する EXCLUSIVE が待たされる SHARED_WRITE PENDING… INSERT INTO 子A … SHARED_READ EXCLUSIVE Lock wait timeout exceeded CREATE TABLE 子B 親
観察してみたこと • CREATE TABLE • 子テーブル B を作成 • 子テーブル
A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • ALTER TABLE • 親テーブルに ALTER TABLE • 子テーブル A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • 子テーブル A に ALTER TABLE • 親テーブルに SELECT が走っている場合 • 親テーブルに INSERT が走っている場合 子A 子B 親
ALTER TABLE - 親テーブルに ALTER TABLE をかける (1) • 子テーブル
A に SELECT が走っている場合 • 子テーブル A の SHARED_READ がとられる • ALTER TALBE 親 の 子テーブル A への EXCLUSIVE が待たされる SHARED_READ SELECT * FROM 子A 親 ALTER TABLE 親 …
ALTER TABLE - 親テーブルに ALTER TABLE をかける (1) • 子テーブル
A に SELECT が走っている場合 • 子テーブル A の SHARED_READ がとられる • ALTER TALBE 親 の 子テーブル A への EXCLUSIVE が待たされる SHARED_READ SELECT * FROM 子A SHARED_UPGRADABLE EXCLUSIVE PENDING… ALTER TABLE 親 … Lock wait timeout exceeded 親
ALTER TABLE - 親テーブルに ALTER TABLE をかける (2) • 子テーブル
A に INSERT が走っている場合 • 子テーブル A の SHARED_WRITE, 親テーブルの SHARED_READ がとられる • ALTER TALBE 親 の 親テーブルへの EXCLUSIVE が待たされる SHARED_WRITE SHARED_READ INSERT INTO 子A … 親 ALTER TABLE 親 …
ALTER TABLE - 親テーブルに ALTER TABLE をかける (2) • 子テーブル
A に INSERT が走っている場合 • 子テーブル A の SHARED_WRITE, 親テーブルの SHARED_READ がとられる • ALTER TALBE 親 の 親テーブルへの EXCLUSIVE が待たされる SHARED_WRITE EXCLUSIVE PENDING… ALTER TABLE 親 … Lock wait timeout exceeded SHARED_READ INSERT INTO 子A … 親
観察してみたこと • CREATE TABLE • 子テーブル B を作成 • 子テーブル
A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • ALTER TABLE • 親テーブルに ALTER TABLE • 子テーブル A に SELECT が走っている場合 • 子テーブル A に INSERT が走っている場合 • 子テーブル A に ALTER TABLE • 親テーブルに SELECT が走っている場合 • 親テーブルに INSERT が走っている場合 子A 子B 親
ALTER TABLE - 子テーブル A に ALTER TABLE をかける (1)
• 親テーブルに SELECT が走っている場合 • 親テーブルの SHARED_READ がとられる • ALTER TABLE 子A は成功する SHARED_READ SELECT * FROM 親 ALTER TABLE 子A …
ALTER TABLE - 子テーブル A に ALTER TABLE をかける (1)
• 親テーブルに SELECT が走っている場合 • 親テーブルの SHARED_READ がとられる • ALTER TABLE 子A は成功する SHARED_READ SELECT * FROM 親 ALTER TABLE 子A … Succeeded!
ALTER TABLE - 子テーブル A に ALTER TABLE をかける (2)
• 親テーブルに INSERT が走っている場合 • 親テーブルの SHARED_WRITE がとられる • ALTER TABLE 子A は成功する SHARED_WRITE INSERT INTO 親 … ALTER TABLE 子A …
ALTER TABLE - 子テーブル A に ALTER TABLE をかける (2)
• 親テーブルに INSERT が走っている場合 • 親テーブルの SHARED_WRITE がとられる • ALTER TABLE 子A は成功する SHARED_WRITE ALTER TABLE 子A … Succeeded! INSERT INTO 親 …
MDL 観察まとめ SHARED_READ SELECT * FROM 子A SHARED_WRITE SHARED_READ INSERT
INTO 子A … SHARED_READ SELECT * FROM 親 SHARED_WRITE INSERT INTO 親 … 子テーブル A に SELECT/INSERT 親テーブルに SELECT/INSERT
DDL の実行で気をつけること(外部キー制約あり) • 親/子A テーブルにロングトランザクションがないか? SELECT * FROM 親 SELECT
* FROM 子A INSERT INTO 親 INSERT INTO 子A CREATE TABLE 子B チェック不要 ALTER TABLE 親 ALTER TABLE 子A チェック不要 チェック不要 子A 子B 親