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
full scratch mysql storage engine
Search
kentsu
January 18, 2020
Technology
630
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
full scratch mysql storage engine
http://rabbitfoot141.hatenablog.com/entry/2020/01/17/012402
kentsu
January 18, 2020
More Decks by kentsu
See All by kentsu
MySQLの今後に期待
lrf141
0
66
mysql-build-debug-and-test
lrf141
3
1.9k
mysql80-date-type-bug-fix
lrf141
1
2.9k
Other Decks in Technology
See All in Technology
AIエージェントの権限管理 3: Agentic RAG の Fine grained access control 編
ren8k
0
150
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.8k
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
25
16k
積み重なった技術負債への挑戦 〜初手としての全社ゴト化〜
techtekt
PRO
0
1.4k
品質と信頼性を地続きにする
grimoh
2
820
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
350
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
150
AIエージェントを最高のパートナーに育てる方法|評価と判断軸を育てる5つのステップ
koichiaoki
1
150
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
1
2.4k
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.3k
WordPressの脆弱性対策何をすべき?
masakawai
0
120
Vibe Coding で作ったプロダクトをどう安全に動かすか / How to Safely Run Products Built with Vibe Coding
glidenote
0
310
Featured
See All Featured
Mind Mapping
helmedeiros
1
360
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
46k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
Claude Code のすすめ
schroneko
67
230k
A designer walks into a library…
pauljervisheath
211
25k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
500
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
The SEO Collaboration Effect
kristinabergwall1
1
570
Ethics towards AI in product and experience design
skipperchong
2
380
Transcript
自作ストレージエンジンから見る MySQL の内部実装 2020/01/18 @lrf141
自己紹介 - けんつ (@lrf141) - DBMS, 分散システム - Go /
PHP / C - MySQL はフェチ - 社会性がたりない
こっち読むと幸せになれる
始める前に
None
24 枚 / 10 分
38 枚 / 5 分
今日話すこと
今日話すこと - OSS としての mysql-server コード・リーディング - 既存の SE 実装
- 内部実装を支えるシステムコール - MySQL Internal Manual - Source Code Documentation
今日話すこと - OSS としての mysql-server コード・リーディング - 既存の SE 実装
- 内部実装を支えるシステムコール - MySQL Internal Manual - Source Code Documentation
今日話すこと - ストレージエンジンを支える仕組み - テーブルファイル作成時の処理 - テーブルファイル読み込み時の処理 - SELECT, INSERT
時の処理
資料 - MySQL Internal Manual - MySQL 8.0.18 Source Code
Documentation - Connpass に掲載したブログ - Github mysql-server
ストレージエンジンを支える仕組み
ストレージエンジンを支える仕組み - Pluggable Storage Engine - Handlerton - Handler -
Share - Lock
Pluggable Storage Engine - MySQL はストレージエンジンをプラグインとして扱う - 共有ライブラリ(.so)形式で /usr/lib/mysql/plugin 以下にあるものが対象
- 動的に設定可能 - mysqld は ha_hoge.cc|.h で宣言、実装されている API を呼び出す
None
handlerton - Handler Singleton - 各ストレージエンジンにつき1つのみの生成 - ストレージエンジンの定義を保持 - メタ情報と
API を実装したメソッドポインタ
None
Handler - テーブル、コネクション毎に作成される - データストレージ、インデックス、行操作 - ロック等、同時実行制御に関する処理も保持 - MySQL Server
と実際に通信するのはこれ - SQL 操作以外にも統計情報系もここ
None
Share - テーブルのメタデータを保持する - インスタンスはテーブル間で共有される - ロックに関するメンバを持つ - ファイルディスクリプタはここで持つと良い?
None
Lock - Share にマスターロック(THR_LOCK)、ハンドラにロックインスタンス (THR_LOCK_DATA) - ロックインスタンスが他のハンドラに対して有効なロックを持つ - Posix Thread
ベース - デフォルトで SELECT は共有ロック、INSERT 等は排他ロック - 内部ロックはロックインスタンスを利用
class Gambit_share : public Handler_share { public: THR_LOCK lock; const
char *name; … } class ha_gambit : public handler { THR_LOCK_DATA lock; ///< MySQL lock Gambit_share *share; ///< Shared lock info Gambit_share * get_share(); ///< Get the share
TABLE 作成時の処理
Table 作成時の処理 - /var/lib/mysql 以下にデータベース名でディレクトリが存在する前提 - テーブル毎にディレクトリが作成される - ha_hoge::create を実装する
- open システムコールのラッパーである my_create を使用する - sdi ファイルも同時に生成される - 作成時にオプションを変更可能
int ha_gambit::create (const char *name, TABLE *, HA_CREATE_INFO *, dd::Table
*) { DBUG_TRACE; File create_file; DBUG_ENTER("ha_gambit::create" ); if ((create_file= my_create(name, 0, O_RDWR | O_TRUNC, MYF(0))) < 0) DBUG_RETURN(-1); if ((my_close(create_file, MYF(0))) < 0) DBUG_RETURN(-1);
TABLE 読み込み時の処理
Table 読み込み時の処理 - ha_hoge::open を実装する - SELECT, INSERT, etc… 時に走るためロックが必要
- ファイルディスクリプタは share でもっておくのが良さそう?
int ha_gambit::open(const char *name, int, uint, const dd::Table *) {
DBUG_TRACE; File open_file; if (!(share = get_share())) return 1; thr_lock_data_init(&share->lock, &lock, NULL); if (!(open_file = my_open(name, O_RDWR, MYF(0)))) return 1; share->table_file = open_file; share->name = name; return 0; }
SELECT, INSERT 時の処理
共通の前提 - Share(TABLE_SHARE) がテーブルのメタデータを保持 - TABLE_SHARE は各フィールドの情報を持つ Field も保持 -
各フィールドは String(sql_string.h) というバッファを利用 - ロックが走る - 内部フォーマットの先頭はカラム数分の Null ビットマップ
for (Field **field = table->field; *field; field++) { const char
*p; const char *end; … }
INSERT 時の処理 ひたすら Field から String バッファに値を格納して my_write するだけ!!!!
SELECT 時の処理 - Field の値を引数である buf に格納 - 値の実体は Field->ptr
- buf にコピーするべきだが Field->ptr と buf は参照先が同じ - store メソッドで Field->ptr に値読み取った値を格納する
おわりに
おわりに - MySQL 内でストレージエンジンが担保する機能は少ない - SE は Handler が肝 -
ロックに関することがわかると大体いける - 全て実装依存 - コードはドキュメント