Understanding MySQL Internalsを読む(11)

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

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

久々の連載更新。ストレージエンジンインタフェースがこれでやっと終わり。まだあといくつかやっておきたいネタがある。

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

メソッド定義 メソッドの説明
virtual int disable_indexes(uint mode) インデックスを一時的に無効化する。DISABLE KEYSコマンドが発行された時に呼ばれる。テーブルロックを伴う大量の更新を行う際に利用する。デフォルト実装ではHA_ERR_WRONG_COMMANDを返す。
virtual int enable_indexes(uint mode) 無効化していたインデックスを有効化する。ENABLE KEYSコマンドが発行された時に呼ばれる。デフォルト実装ではHA_ERR_WRONG_COMMANDを返す。
virtual int index_are_disabled(void) このテーブルのインデックスが無効化されている場合には1、そうでない場合には0を返す。
virutal void start_bulk_insert(ha_rows rows) バルクインサートのための最適化を行うようにストレージエンジンに指示を出す。MySQLはテーブルに対して大量のINSERTを行う前にこのメソッドを呼び出す。MyISAMの場合、バルクインサートに備えてキーの値をメモリにキャッシュしてキーの値順になるようにB-treeインデックスに格納する。デフォルト実装では何もしない。
virtual int end_bulk_insert() バルクインサート処理が完了した際に呼ばれる。処理に成功した場合に0、失敗した場合には0以外のエラーコードを返す。デフォルト実装では単に0を返す。
virtual int discard_or_import_tablespace(my_bool discard) このテーブルに対して割り当てられたテーブルスペースに対する処理を行うため、InnoDBが使用するメソッド。バックアップからテーブルスペースへのインポートへの準備、リストア対象のテーブルスペースが意図した場所にコピーされた後のバックアップからデータ復旧など。ALTER TABLE ... DISCARD TABLESPACEコマンドあるいはALTER TABLE ... IMPORT TABLESPACEコマンドが発行された際に呼ばれる。成功した場合には0、失敗した場合には0以外のエラーコードを返す。デフォルト実装ではHA_ERR_WRONG_COMMANDを返す。
virtual int net_read_dump(NET* net) 引数で指定されたネットワーク接続からテーブルデータを読んでテーブルに格納する。成功した場合には0、失敗した場合には0以外のエラーコードを返す。デフォルトの実装ではHA_ERR_WRONG_COMMANDを返す。ver5.2で削除される予定。
virtual char *update_table_comment(const char * comment) SHOW TABLESコマンドが発行された際に返す情報の一つ、Commentを返す。戻り値はCommentの文字列へのポインタ。引数と戻り値のポインタが異なる場合、新しいポインタがmy_alloc()で割り当てられており、この文字列が使い終わったときにmy_free()で解放されることが推測される。このメソッドを実装しているのはInnoDBのみ。デフォルト実装では単に引数の値を返す。
virtual void append_create_info(String *packet) ストレージエンジン独自の追加情報を引数のStringオブジェクトに追記する。SHOW CREATE TABLEコマンドの出力を生成する際に使用される。デフォルト実装では何もしない。
virtual char* get_foreign_key_create_info() 外部キーの作成に関するCREATE TABLEの文字列の一部へのポインタを返す。SHOW CREATE TABLEコマンドの出力を生成する際に使用される。デフォルト実装では0が返される。
virtual uint referenced_by_foreign_key() このテーブルが他のテーブルの外部キーから参照されている場合に1を返し、そうでない場合には0を返す。デフォルト実装では0が返される。
virtual void init_table_handle_for_HANDLER() HANDLERコマンド実行のための準備を行う。HANDLERコマンドはストレージエンジンに対する低レベルの操作を行うためのSQLコマンド。デフォルト実装では何もしない。
virtual void free_foreign_key_create_info(char* str) 必要に応じて、get_foreign_key_create_info()で返されたポインタが参照するメモリを解放する。デフォルト実装では何もしない。
virtual const char *table_type() const =0 ストレージエンジンの名前を返す。このメソッドは純粋仮想関数なので各エンジンで実装する必要がある。
virtual const char **bas_ext() const =0 ストレージエンジンがデータとインデックスを格納するのに使用するファイルの拡張子の配列を返す。配列の最後の要素は0である必要がある。このメソッドは純粋仮想関数なので各エンジンで実装する必要がある。
virtual ulong table_flags(void) const =0 このストレージエンジンのキャパビリティを示すビットマスクを返す。キャパビリティはsql/handler.hに定義されている。このメソッドは純粋仮想関数なので各エンジンで実装する必要がある。
virtual ulong index_flags(uint idx, uint part, bool all_parts) const =0 引数で指定されたキーまたはその一部部分についてのキャパビリティを示すビットマスクを返す。キャパビリティはsql/handler.hに定義されている。このメソッドは純粋仮想関数なので各エンジンで実装する必要がある。
virtual ulong index_ddl_flags(KEY *wanted_index) const 引数で指定されたキーの作成・削除に関するキャパビリティを示すビットマスクを返す。デフォルト実装はDDL_SUPPORTを返し、このストレージエンジンが引数のキー定義に基づいたキーの作成を行えるが、既存のテーブルへの追加は行えないことを意味する(MySQLはこのインデックスを含む新しいテーブルを作り、データをコピーする)。
virtual int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys) キーの集合をテーブルに追加する。第二引数はキーの配列。第三引数は配列のサイズ。成功した場合には0を返し、失敗した場合には0以外のエラーコードを返す。デフォルト実装ではHA_ERR_WRONG_COMMANDが返される。
virtual int drop_index(TABLE *table_arg, uint *key_num, uint num_of_keys) 引数で指定されたキーをテーブルから削除する。成功した場合には0を返し、失敗した場合には0以外のエラーコードを返す。デフォルト実装ではHA_ERR_WRONG_COMMANDが返される。
uint max_record_length() const レコード長の制限値(最大)を返す。ストレージエンジンがサポートする最大サイズとMySQLのコアライブラリのコードがサポートする最大サイズのうちの小さいほうが使用される。
uint max_keys() const キーの数の制限値(最大)を返す。ストレージエンジンがサポートする最大サイズとMySQLのコアライブラリのコードがサポートする最大サイズのうちの小さいほうが使用される。
uint max_key_parts() const 複合キーとして構成可能なカラム数の制限値(最大)を返す。ストレージエンジンがサポートする最大サイズとMySQLのコアライブラリのコードがサポートする最大サイズのうちの小さいほうが使用される。
uint max_key_length() const キー長の制限値(最大)を返す。ストレージエンジンがサポートする最大サイズとMySQLのコアライブラリのコードがサポートする最大サイズのうちの小さいほうが使用される。
uint max_key_part_length() const 複合キーを構成するカラム長の制限値(最大)を返す。ストレージエンジンがサポートする最大サイズとMySQLのコアライブラリのコードがサポートする最大サイズのうちの小さいほうが使用される。
virtual uint max_supported_record_length() const ストレージエンジンがサポートするレコードの最大長を返す。
virtual uint max_supported_keys() const ストレージエンジンがサポートするキーの最大数を返す。
virtual uint max_supported_key_parts() const ストレージエンジンがサポートする複合キーの最大カラム数を返す。
virtual uint max_supported_key_length() const ストレージエンジンがサポートするキーの最大長を返す。
virtual uint max_supported_key_part_length() const ストレージエンジンがサポートする複合キー構成カラムの最大長を返す。
virtual uint min_record_length(uint options) const ストレージエンジンがポートするレコードの最小サイズを返す。デフォルト実装では1が返される。
virtual bool low_byte_first() const このストレージエンジンのネイティブバイトオーダーがリトルエンディアンである場合には1を返し、そうでなければ0を返す。デフォルト実装では1が返される。
virtual uint checksum() const このテーブルのチェックサムを返す。デフォルト実装では1が返される。
virtual bool is_crashed() const このテーブルが破損している場合には1が返される。CHECK TABLEコマンドが発行された時、あるいは通常のread/write操作が行われた際に問題が発見された時にこのメソッドが使用される。これにより破損しているとマークされたテーブルは速やかにオフライン状態になる。REPAIR TABLEによる修復処理が正常に行われた場合にはこの破損マークが取り除かれる。
virtual bool auto_repair() const ストレージエンジンがテーブルの自動修復機能を有している場合には1が返される。現在、MyISAMのみが対応している。
virtual int rename_table(const char *from, const char *to) テーブルを引数fromで指定されたパスからtoで指定されたパスへ移動する。これら引数はテーブル定義ファイルから拡張子.frmを取り除いたもの。デフォルト実装ではbas_ext()によって返された拡張子のファイルの移動が行われる。成功した場合には0が返され、失敗した場合には0以外の値のエラーコードが返される。
virtual int delete_table(const char *name) 引数nameで指定されたテーブルを削除する。引数nameはテーブル定義ファイルから拡張子.frmを取り除いたもの。デフォルト実装ではbas_ext()によって返された拡張子のファイルの削除が行われる。成功した場合には0が返され、失敗した場合には0以外の値のエラーコードが返される。
virtual int create(const char *name, TABLE *from, HA_CREATE_INFO *info)=0 引数formおよびinfoの内容に基づいて引数nameテーブルを作成する。処理に成功した場合には0を返し、失敗した場合には0以外の値のエラーコードを返す。このメソッドは純粋仮想関数なので各エンジンで実装する必要がある。
virtual uint lock_count(void) const このテーブルに格納するのに必要なロック記述子ブロックの数を返す。ほとんどのケースでは1つのみが必要とされるが、MERGEテーブルでは対象のMyISAMテーブル数分だけ必要となる。デフォルト実装では1が返される。
virtual THR_LOCK_DATA **store_lock(THD *thd, THR_LOCK_DATA ** to, enum thr_lock_type lock_type)=0 このテーブルに関連するロック記述子の位置を引数toで指定されたアドレスに格納する。他の引数は現在のスレッド記述子、およびロックの種類(ストレージエンジンで必要に応じて利用)となっている。このメソッドは実際にロックが格納される前にストレージエンジン側で何かロックの修正を行えるようにするために用意されている。行ロックを実装しているストレージエンジンはこのメソッドを使うことで、ロックマネージャがテーブルに対して排他ロックを行なわないように回避している。処理に成功した場合にはtoの値を返し、失敗した場合には0を返す。このメソッドは純粋仮想関数なので各エンジンで実装する必要がある。
virtual uint8 table_cache_type() クエリキャッシュに関連するオプションのビットマスクを返す。デフォルト実装ではHA_CACHE_TBL_NONTRANSACTが返される。これはトランザクションの実行中かどうかに関わらずキャッシュが可能ということを意味する。HA_CACHE_TBL_ASKTRANSACTが返された場合にはクエリキャッシュ機能はキャッシュを行う際に毎回ストレージエンジンに対して問い合わせを行う。ストレージエンジンはトランザクションの可視性に基づいて判断する(※マルチバージョニングのことを言っているのかと)。
virtual const COND *cond_push(const COND *cond) WHERE句の一部にマッチしないレコードをフィルタリングするためにストレージエンジンにより使用されるメソッド。元々はNDBストレージエンジンのために用意された。NDBストレージエンジンではレコードをリモートのノードに格納する可能性があり、WHERE句の一部を内部的に処理できるのにはメリットがある。引数で指定されたWHERE句の部分条件はこのストレージエンジンインスタンスの条件式のスタックに積まれる。そしてレコードがWHERE句に実際にマッチするかどうかを評価するための新しい評価式ツリーが返される。このフィルタリングがストレージエンジン内部のみで完結する場合にはNULLが返される。デフォルト実装では何も行わずに引数をそのまま戻り値として返す。
virtual void cond_pop() ストレージエンジンインスタンスの条件式のスタックの最も上の要素を削除する。デフォルト実装では何も行わない。
virtual void try_semi_consistent_read(bool flag) 現在のレコードが他のトランザクションにロックされている場合に最新のcommit値を読んで返すことを許可するかどうかをストレージエンジンに対して伝達する。このメソッドはInnoDBがUPDATEやDELETE中に不要なロックを回避できるようにするために使用されている。
virtual bool was_semi_consistent_read() 現在のレコードの値を読まなかった場合にレコードの読み込みの記録を更新しないよう、ストレージエンジンがオプティマイザに伝える際にtrueを返す。

エンジンは長かったなぁ。

というわけでオイラの夏休みも今日で御しまい。明日社会復帰します。