Understanding MySQL Internalsを読む(10)

連載記事一覧は*こちら*にあります。

http://mirz.jpでまとめて読むこともできます(オススメ)。

ストレージエンジンインタフェースの続き。忙しくなってきたのでビルド待ちの時間にコツコツ書いていたものをUP。

handlerクラスのメソッド(続き)

メソッド定義 メソッドの説明
virtual int rnd_same(byte *buf, uint inx) 引数inxが0以上の場合、inxをキー番号として現在のレコードを読み取り引数bufのバッファに格納する。成功した場合に0を返し、失敗した場合には0以外のエラーコードを返す。現在、このメソッドはどこからも呼ばれておらず、オーバーライドしているストレージエンジンも存在しない。デフォルトの実装は、HA_ERR_WRONG_COMMANDを返す。しかしながら、MEMORYエンジンとMyISAMエンジンはこのメソッドの実装を提供するためのフックをそれぞれheap/hp_rsame.cとmyisam/mi_rsame.cに持っている。
virtual ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key) 引数inxで番号が指定されたキーの中で、引数min_keyとmax_keyにより規定された範囲条件下に含まれるであろうレコードの数の推定値を返す。デフォルトの実装は10を返す。でたらめな値を返してしまうと、最悪のケースとしてはオプティマイザが適切なキーを使用しなくなったり、あるいはまったくキーを使用しないといったようなことが起こりうる。
virtual void position(const byte *record)=0 handlerクラスのメンバrefに格納されているユニークな参照の値を現在のレコードに保存する。MyISAMではこの値はデータファイルにおけるレコードの位置情報である。このメソッドの名前がpositionなのはそのため。ストレージエンジンによっては前のレコードのユニーク参照値を保持していない可能性があり、実際のレコードを確認する必要があるかもしれないが、その場合は引数を利用することができる。このメソッドは純粋仮想関数なので、サブクラス側で必ず実装しなければならない。
virtual void info(uint flag)=0 引数のflagで指定された内容に基づいて、様々な統計情報用の変数の値を更新する。このメソッドは純粋仮想関数なので、サブクラス側でかならず実装しなければならない。
virtual int extra(enum ha_extra_function operation) ある種の特別な最適化を行うためのヒントをストレージエンジンに与える。引数がHA_EXTRA_KEYREADの場合、対象のキーに対する読取りは、そのキーに含まれているレコードのカラムのみに対して行われる可能性がある。成功した場合に0、失敗した場合には0以外のエラーコードを返す。デフォルト実装は単純に0を返すもので、このヒントは無視しても構わない。
virtual int extra_opt(enum ha_extra_function operation, ulong cache_size) extra()と同じだが、呼び出し元が引数cache_sizeを渡せる点が異なる。主に様々な種類のI/Oのためのキャッシュサイズを制御するのに使用される。
virtual int reset() handler::extra(HA_EXTRA_RESET)のWrapperメソッド。事前にextraメソッドの呼び出しで割り当てられたリソースを開放し、ストレージエンジンの操作モードをデフォルトに戻す。
virtual int external_lock(THD *thd, int lock_type)=0 MySQLサーバはこのメソッドをクエリ中で使用されているテーブルごとに1回ずつ最初に呼び出す。MyISAMはexternal lockingオプションが有効になっている場合、OSに依頼してキーファイル(MYI)をロックすし、またそれであるがゆえにこのメソッドの呼び名がexternal_lockになっている。トランザクション対応のストレージエンジンでは、トランザクションの開始と必要な初期処理を行うためのフックポイントとして利用している。成功した場合に0、失敗した場合には0以外のエラーコードを返す。このメソッドは純粋仮想関数なので、サブクラス側で必ず実装しなければならない。
virtual void unlock_row() UPDATEやDELETEの処理中にWHERE句の条件と一致しないために行ロックが不要な行に対してそれぞれ呼ばれる。準一貫性読み込みモード(他のトランザクションによりロックされている行に対しては最新のコミットされた値を読む=マルチバージョニング)で読まれた行に対するロックを解除するためにInnoDBによって呼ばれる。
virtual int start_stmt(THD *thd) LOCK TABLESコマンドによりトランザクションが開始された際の初期処理で呼ばれ、トランザクション対応のストレージエンジンにトランザクションの開始を登録する機会を与える。処理に成功した場合に0、失敗した場合には0以外の値のエラーコードが返される。デフォルトの実装では何も行わず、成功したと報告される。
virtual int delete_all_rows() テーブルから一度に全ての行を削除する。これは最適化手法のひとつ。エンジンによってこの操作がサポートされていない場合には、delete_row()が複数回呼ばれてテーブルがクリアされる。処理に成功した場合に0、失敗した場合に0以外の値のエラーコードを返す。デフォルトの実装はHA_ERR_WRONG_COMMANDを返す。
virtual longlong get_auto_increment() autoincrementキーで使用する次の値。興味深いことに、このメソッドはかなり複雑な実装が行われているにも関わらず、多くの既存のストレージエンジンはこのメソッドをオーバーライドしている。
virtual int check(THD* thd, HA_CHECK_OPT* check_opt) テーブルに構造的なエラーがないかどうかを確認する。CHECK TABLEコマンドが発行された時に呼ばれる。引数thdは現在のスレッド記述子。引数check_optはこの操作を行う際のオプション情報を格納している構造体へのポインタ。処理に成功した場合には0、失敗した場合には0以外の値のエラーコードを返す。デフォルト実装ではHA_ADMIN_NOT_IMPLEMENTEDが返される。
virtual int restore(THD* thd, HA_CHECK_OPT* check_opt) .frmファイルとデータファイルからインデックスファイルを再生成する。現在このメソッドをオーバーライドしているのはMyISAMのみ。処理に成功した場合には0、失敗した場合には0以外の値のエラーコードを返す。デフォルト実装ではHA_ADMIN_NOT_IMPLEMENTEDが返される。このメソッドはver5.2で削除される予定。
virtual int repair(THD* thd, HA_CHECK_OPT* check_opt) 破損したテーブルを修復する。REPAIR TABLEコマンドが発行された時に呼ばれる。処理に成功した場合には0、失敗した場合には0以外の値のエラーコードを返す。デフォルト実装ではHA_ADMIN_NOT_IMPLEMENTEDが返される。
virtual int optimize(THD* thd, HA_CHECK_OPT* check_opt) 典型的なクエリにとって最も適した形になるようにテーブルを再構築する。OPTIMIZE TABLEコマンドが発行された時に呼ばれる。処理に成功した場合には0、失敗した場合には0以外の値のエラーコードを返す。デフォルト実装ではHA_ADMIN_NOT_IMPLEMENTEDが返される。
virtual int analyze(THD* thd, HA_CHECK_OPT* check_opt) オプティマイザによって使用されるインデックス統計情報を更新する。ANALYZE TABLEコマンドが発行された時に呼ばれる。処理に成功した場合には0、失敗した場合には0以外の値のエラーコードを返す。デフォルト実装ではHA_ADMIN_NOT_IMPLEMENTEDが返される。
virtual int assign_to_keycache(THD* thd, HA_CHECK_OPT* check_opt) ポインタ引数check_optが指す構造体の中で指定されているキーキャッシュにこのテーブルの全てのキー(インデックス)を関連付ける。CACHE INDEXコマンドが発行された時に呼び出される。処理に成功した場合には0、失敗した場合には0以外の値のエラーコードを返す。デフォルト実装ではHA_ADMIN_NOT_IMPLEMENTEDが返される。
virtual int preload_keys(THD* thd, HA_CHECK_OPT* check_opt) ポインタ引数check_optが指す構造体の中で指定されているキーキャッシュにこのテーブルの全てのキー(インデックス)を格納する。CACHE INDEXコマンドが発行された時に呼び出される。処理に成功した場合には0、失敗した場合には0以外の値のエラーコードを返す。デフォルト実装ではHA_ADMIN_NOT_IMPLEMENTEDが返される。
virtual bool check_and_repair(THD *thd) テーブルの破損チェックを行い、必要であれば修復する。処理に成功した場合に0、失敗した場合に1を返す。デフォルト実装では単純に1を返す。
virtual int dump(THD* thd, int fd = -1) テーブルデータを各ストレージエンジン独自のフォーマットに従って、引数fdで指定されたファイル記述子に出力する。fdが0未満の場合はテーブルデータは引数thdに関連付けられているネットワーク接続に対して出力される。出力フォーマットはnet_read_dump関数で扱えるものでなければならない。このメソッドはLOAD DATA FROM MASTERコマンドが発行された時に呼ばれる。現在、このメソッドをオーバーライドしているのはMyISAMのみ。処理に成功した場合に0、失敗した場合に0以外のエラーコードを返す。デフォルト実装ではHA_ERR_WRONG_COMMANDを返す。このメソッドはver5.2で削除される予定。