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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yoshikai
July 05, 2025
0
200
外部キー制約を持つテーブルに対する DDL の MDL を観察してみた
yoshikai
July 05, 2025
Tweet
Share
More Decks by yoshikai
See All by yoshikai
DBA 1年目で勉強になった DDL 3選
yoshikai
0
110
Featured
See All Featured
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
400
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
70
Producing Creativity
orderedlist
PRO
348
40k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
68
Bash Introduction
62gerente
615
210k
Marketing to machines
jonoalderson
1
4.7k
Between Models and Reality
mayunak
1
200
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
58
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
440
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 親