すごい雨の中,GREE Labs さん主催による http://labs.gree.jp/Top/Study/20090807.html に参加してきました.以下,そのログなど.
###まとめと感想
- すごい雨降ってました
- それにしては人多い気がする
- 日本MySQLユーザ会 松信さん
- ust ありません
- 来て良かった
- トラックバックまでが勉強会メソッド
- ちょっと寒かった
- ソースコード読むの楽しそう!
- いろいろ奥が深そう
- プラグインレベルなら何とか作れそうな感じがした
- EXPLAIN じゃない実行計画をしっかり知りたいなと思った.それを理解しないと MySQL を使いこなせない印象.
##MySQLハッキングの手引き
- MySQl のアーキテクチャ
- ビルド方法
- デバッグ方法
- プラグイン開発の方法
- 本体拡張の方法
- 本家へのコントリビュートの方法
- 自己紹介
- MySQLコンサルタント
- 執筆
- 現場で使える MySQL
- Linux-DB に関する本(2009⁄09 予定)
- DBマガジンで10月から連載?
###MySQL とは
- C/C++/アセンブラ
- 現在は MySQL 5.4 beta, MySQL 5.1⁄5.0 stable
###アーキテクチャ
- 固定部分
- リスナー(認証) -> パーサ -> オプティマイザ -> テーブルアクセス/ジョイン
- 全文検索インデックス
- レプリケーション
プラグイン部分
- 監査ログ
- Information Schema
- UDF
- ストレージエンジン(MyISAM/InnoDB/etc)
特徴
- 外部ライブラリには極力依存しない
- STL/boost とか使っていない
- プラットフォーム依存性を減らすため
- Drizzle では方針が逆転している
- デバッグ用の機能
- malloc/free, pthread_* は wrapper がある
- エンディアンフリー
- リトルエンディアン
- マルチプラットフォームのため
- 関数ポインタ,サブクラスを多用して汎用性を上げている
- ストレージエンジンなどの,プラグインのために
- 実行時速度重視のビルド
###MySQL を拡張する
- MySQL の本体に手を入れる
- なんでもできるがリスクは伴う
- MySQLの「プラグイン」を開発する
- プラグインは共有ライブラリ (.so/.dll)
- 要件によっては実装できない場合がある
- プラグインインターフェイスの範囲内
###MySQL の入手方法
- 本家サイトから
- bzr を利用
- launchpad 上でホストされている
###開発の流れ
- 初期ビルド -> 改変 -> デバッグビルド -> テスト -> 改変 ->
- BUILD/autorun.sh
- 1~2分(速いマシン)
- 松信さんは VisualStudio でやっているそうです
- VisualStudio は少数派
- BUILD/以下にテンプレートがある
- VisualStudio -> あとで資料見て
###デモ(1) デバッグ/トレース
- 目的
- クラッシュ原因を探る
- 動作過程を探るため
- login_connection
- ログインに関わる接続とか
- mysql_parse
- SQL の parse
- MYSQL_parse で構文解析
- クエリーキャッシュにヒットするかどうか調べて,ヒットするれば返す
- mysql_execute_command
- クエリーを実行する
- SQL コマンドによって処理の場合分けをしている
- SELECT だと,その中で権限管理するとか
- JOIN::optimize()
- 実行計画を決める
- 毎回呼ばれる
- 主キー指定の検索をすると
- make_join_statistics
- 主キーを使うのかとか,どういう条件かとか処理
- EXPLAIN で Const <- JT_CONST
- 範囲検索
- InnoDB の storage engine の API records_in_range を呼んでいる
- どのぐらいのレコードを scan するかを問い合わせて,インデックスを使うか table scan かを決めている的な
- join->examined_rows++ で処理レコード数を出している
- slow-query-log のあれ
- トレース
- Solaris の dtrace で
- call stack を見る
- やってみてください!
- 単純な SELECT で 4000行程度
###プラグイン化の流れ
- 本体改変の難易度が高い
- QA の観点からパッチは入りにくい
- 同期レプリケーションプラグインとかデータベースエンジンとかもプラグイン
- プラグイン化の流れが進んでいる
- さらに推し進めたのが Drizzle
###デモ(2) プラグインの開発
- information_schema に関するもの
- /proc/meminfo を information_schema から見れるようにする
- ST_FIELD_INFO
- 列情報
- file_meminfo
- fopen で /proc/meminfo を拾って,table に入れる
- schema_table_store_record で information_schema に入れる
- mysql_is_meminfo_plugin_init 初期化
- mysql_declare_plugin(mysql_meminfo) マクロで初期化補助?
ビルド方法
- –shared 共有ライブラリ
UDF
- ストレージエンジンAPI を使って直接テーブルにアクセスする
- Key Value Store を使うような感覚
- 友人100人の,最新投稿メッセージIDを取得する
- SQL でやるとフルインデックススキャン
- UDF でやることでかなり高速化できる
ベンチマーク
- SQL < STORED PROCEDURE << UDF
- optimizer にキャッシュ機能がないので,毎回実行計画を立てている
- UDF はオレオレ実行計画なので,そこをすっ飛ばすから高速!
###プラグイン開発の一般的な注意事項
- mysqld を落とすことが出来る
- 一般権限を付与しないこと
- セキュリティホールになるので注意
- root で実行しない
- バージョン依存性が高くなる
###次世代RDBMSアーキテクチャ?
- パーサー -> クエリ書き換えで,テーブル実体に高速アクセス
###MySQl 本体に手を入れる
- レビューのプロセスが必要
- 多くの場合互換性の確保が大きな壁になる
###デモ(3) MySQL本体拡張
- レコードサイズの最大サイズを 64kb 以上にする
- .frm = テーブル定義ファイル
- pack_header
- reclength が max_record_length 超えているとエラーになる
- これを拡張
- さらにストレージエンジンの最大長も拡張
- .frm に保存領域がないので,最後の方に無理矢理書き込む
- 読み込みの時にも細工をする
###WorkLog
- 開発計画
- パッチを投げると
- レビューアがついてレビューされる
- コーディング規約に準拠しているか
###テスト
- mysql-test
- mysql-stress-test.pl
- ストレステスト
###WorkLogの例
- バイナリログの追記 -> 上書き変更パッチ
- 上書きにするとレプリケーションの binlog が EOF に来たことがわからない
- EOF -> 転送終わりの判定をしている
- かなり他の部分も変更しなくてはならないので,簡単ではない
###参考文献
- http://forge.mysql.com/
- Expert MySQL
Expert MySQL
著者: Charles Bell
出版日: 2007-01-26
出版社/メーカー: Apress
カテゴリ: Book
- UDF,ストレージエンジンを自作する方法など
- Understanding MySQL internals
Understanding MySQL Internals
著者: Sasha Pachev
出版日: 2007-04
出版社/メーカー: Oreilly & Associates Inc
カテゴリ: Book
- 超極める MySQL
超・極める!MySQL
著者: 坂井 恵, 志村 和彦, ひろせ まさあき, 松信 嘉範
出版日: 2006-10-04
出版社/メーカー: 翔泳社
カテゴリ: Book
##懇親会
- いつも通り「まずは食う」ー>「落ち着いたら話す人探す」手法
- @littlestarling さんの DB の師匠さんとずっと話してました.いい話が聞けた.
- 楽天の安武さんは emacs 使い仲間でした.