Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
外部キー制約を持つテーブルに対する DDL の MDL を観察してみた
Search
yoshikai
July 05, 2025
0
190
外部キー制約を持つテーブルに対する DDL の MDL を観察してみた
yoshikai
July 05, 2025
Tweet
Share
More Decks by yoshikai
See All by yoshikai
DBA 1年目で勉強になった DDL 3選
yoshikai
0
100
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
120
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
190
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
0
96
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
120
Visualization
eitanlees
150
16k
We Are The Robots
honzajavorek
0
120
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.8k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.3k
New Earth Scene 8
popppiees
0
1.2k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
190
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
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 親