すごい雨の中,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

    • UDF,ストレージエンジンを自作する方法など
  • Understanding MySQL internals

  • 超極める MySQL

##懇親会

  • いつも通り「まずは食う」ー>「落ち着いたら話す人探す」手法
  • @littlestarling さんの DB の師匠さんとずっと話してました.いい話が聞けた.
  • 楽天の安武さんは emacs 使い仲間でした.