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
full scratch mysql storage engine
Search
kentsu
January 18, 2020
Technology
1
560
full scratch mysql storage engine
http://rabbitfoot141.hatenablog.com/entry/2020/01/17/012402
kentsu
January 18, 2020
Tweet
Share
More Decks by kentsu
See All by kentsu
mysql-build-debug-and-test
lrf141
3
1.7k
mysql80-date-type-bug-fix
lrf141
1
2.7k
Other Decks in Technology
See All in Technology
2025-04-24 "Manga AI Understanding & Localization" Furukawa Arata (CyberAgent, Inc)
ornew
2
330
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
7
63k
SREからゼロイチプロダクト開発へ ー越境する打席の立ち方と期待への応え方ー / Product Engineering Night #8
itkq
2
1.1k
本当に必要なのは「QAという技術」だった!試行錯誤から生まれた、品質とデリバリーの両取りアプローチ / Turns Out, "QA as a Discipline" Was the Key!
ar_tama
2
260
Goの組織でバックエンドTypeScriptを採用してどうだったか / How was adopting backend TypeScript in a Golang company
kaminashi
12
9.1k
ガバクラのAWS長期継続割引 ~次の4/1に慌てないために~
hamijay_cloud
1
580
Microsoft Fabric vs Databricks vs (Snowflake) -若手エンジニアがそれぞれの強みと違いを比較してみた- "A Young Engineer's Comparison of Their Strengths and Differences"
reireireijinjin6
1
130
Microsoft の SSE の現在地
skmkzyk
0
280
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
2
450
Simplify! 10 ways to reduce complexity in software development
ufried
1
220
コードや知識を組み込む / Incorporating Codes and Knowledge
ks91
PRO
0
160
テストって楽しい!開発を加速させるテストの魅力 / Testing is Fun! The Fascinating of Testing to Accelerate Development
aiandrox
0
160
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
430
65k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
21k
BBQ
matthewcrist
88
9.6k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Writing Fast Ruby
sferik
628
61k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
Bash Introduction
62gerente
612
210k
Six Lessons from altMBA
skipperchong
28
3.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Large-scale JavaScript Application Architecture
addyosmani
512
110k
GraphQLとの向き合い方2022年版
quramy
46
14k
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 が肝 -
ロックに関することがわかると大体いける - 全て実装依存 - コードはドキュメント