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
外部キー制約を持つテーブルに対する DDL の MDL を観察してみた
Search
yoshikai
July 05, 2025
230
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
120
Featured
See All Featured
We Are The Robots
honzajavorek
0
280
The Cost Of JavaScript in 2023
addyosmani
55
10k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
400
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
840
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
360
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Crafting Experiences
bethany
1
220
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
HDC tutorial
michielstock
2
750
Done Done
chrislema
186
16k
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 親