GREE オープンソース勉強会 第18回 MySQLハッキングの手引きに行ってきた

すごい雨の中,GREE Labs さん主催による GREE Engineering に参加してきました.以下,そのログなど.

まとめと感想
  • すごい雨降ってました
    • それにしては人多い気がする
  • 日本MySQLユーザ会 松信さん
  • ust ありません
    • 来て良かった
  • トラックバックまでが勉強会メソッド
  • ちょっと寒かった
  • ソースコード読むの楽しそう!
    • いろいろ奥が深そう
  • プラグインレベルなら何とか作れそうな感じがした
  • EXPLAIN じゃない実行計画をしっかり知りたいなと思った.それを理解しないと MySQL を使いこなせない印象.

MySQLハッキングの手引き

MySQL とは
アーキテクチャ
  • 特徴
    • 外部ライブラリには極力依存しない
      • STL/boost とか使っていない
        • プラットフォーム依存性を減らすため
      • Drizzle では方針が逆転している
    • デバッグ用の機能
      • malloc/free, pthread_* は wrapper がある
    • エンディアンフリー
    • 関数ポインタ,サブクラスを多用して汎用性を上げている
    • 実行時速度重視のビルド
MySQL を拡張する
MySQL の入手方法
  • 本家サイトから
  • bzr を利用
  • launchpad 上でホストされている
開発の流れ
  • 初期ビルド -> 改変 -> デバッグビルド -> テスト -> 改変 ->
    • BUILD/autorun.sh
    • 1〜2分(速いマシン)
    • 松信さんは VisualStudio でやっているそうです
      • VisualStudio は少数派
  • BUILD/以下にテンプレートがある
  • VisualStudio -> あとで資料見て
デモ(1) デバッグ/トレース
  • 目的
    • クラッシュ原因を探る
    • 動作過程を探るため
  • login_connection
    • ログインに関わる接続とか
  • mysql_parse
    • SQL の 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行程度
プラグイン化の流れ
デモ(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 -> 転送終わりの判定をしている
    • かなり他の部分も変更しなくてはならないので,簡単ではない
参考文献

Expert MySQL

Expert MySQL

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

Understanding MySQL Internals: Discovering and Improving a Great Database

Understanding MySQL Internals: Discovering and Improving a Great Database

超・極める!MySQL

超・極める!MySQL

懇親会

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