HANDLERtbl_nameOPEN [ ASalias] HANDLERtbl_nameREADindex_name{ = | >= | <= | < } (value1,value2,...) [ WHEREwhere_condition] [LIMIT ... ] HANDLERtbl_nameREADindex_name{ FIRST | NEXT | PREV | LAST } [ WHEREwhere_condition] [LIMIT ... ] HANDLERtbl_nameREAD { FIRST | NEXT } [ WHEREwhere_condition] [LIMIT ... ] HANDLERtbl_nameCLOSE
HANDLER ステートメントは、テーブル ストレージ エンジン インターフェースへの直接アクセスを供給します。これは MyISAM と InnoDB テーブルに有効です。
HANDLER ... OPEN ステートメントはテーブルをオープンし、それに続く HANDLER ... READ ステートメントを通してテーブルをアクセス可能にします。このテーブルは他のスレッドと共有されず、スレッドが HANDLER ... CLOSE をコールするか、終了するまでは閉じられません。もしエイリアスを利用してテーブルをオープンすると、別の HANDLER ステートメントを利用しているオープンされたテーブルへの更なる参照時には、テーブル名ではなくエイリアスを利用しなければいけません。
最初の HANDLER ... READ 構文は、指定されたインデックスが与えられた値を満たし WHERE 条件が一致する行をフェッチします。もし複合カラム インデックスがあるなら、インデックス カラム値をカンマで区切られたリストで指示してください。インデックス内の全てのカラムに値を指定するか、インデックス
カラムの左端のプリフィックスに値を指定してください。インデックス my_idx が col_a、col_b、そして col_c という名前の3つのカラムをこの通りの順番で含むと仮定してください。HANDLER ステートメントはインデックス内の3つ全てのカラム、または左端のプリフィックス内のカラムに値を指定する事ができます。例:
HANDLER ... READ my_idx = (col_a_val,col_b_val,col_c_val) ... HANDLER ... READ my_idx = (col_a_val,col_b_val) ... HANDLER ... READ my_idx = (col_a_val) ...
テーブルの PRIMARY KEY を参照する為に HANDLER インターフェースを利用するには、引用識別子の `PRIMARY` を利用してください。
HANDLER tbl_name READ `PRIMARY` ...
2つ目の HANDLER ... READ 構文は WHERE 条件に合うインデックス順でテーブルから行をフェッチします。
2つ目の HANDLER ... READ 構文は WHERE 条件に合うインデックス順でテーブルから行をフェッチします。これは、フル テーブル スキャンが必要な時には HANDLER tbl_name READ index_name よりも速いです。自然な行の順番というのは、MyISAM テーブル データ ファイルの中で行が格納されている順番です。このステートメントは InnoDB テーブルにも機能しますが、別のデータ ファイルがないので同じようなコンセプトはありません。
HANDLER ... READ の全ての形は単列が空いていれば LIMIT 無しでそれをフェッチします。指定した行数を返す為には LIMIT 条項を含んでください。これは、SELECT ステートメントと同じ構文を持ちます。詳しくは 項 「SELECT 構文」 を参照してください。
HANDLER ... CLOSE は HANDLER ... OPEN がオープンしたテーブルを閉じます。
HANDLER は若干低レベルなステートメントです。例えば、これは一貫性を持ちません。これは、HANDLER ... OPEN はテーブルのスナップショットを 撮らない、またテーブルを ロックしない という事です。これは、HANDLER ... OPEN ステートメントが発行された後、テーブル データを変更する事ができ(現在のスレッドか別のスレッドを利用して)、そしてそれらの変更点はHANDLER ... NEXT か HANDLER ... PREV スキャンで部分的にだけ見る事ができるかもしれない、という事を意味します。
通常の SELECT ステートメントの代わりに、HANDLER インターフェースを利用するのにはいくつかの理由があります。
HANDLER は SELECT よりも速いです。
指定されたストレージ エンジン ハンドラ オブジェクトは HANDLER ... OPEN に割り当てられます。そのオブジェクトは、そのテーブルの後続 HANDLER ステートメントに再利用されます。それぞれに対して再初期化する必要はありません。
解析はあまり行われません。
オプチマイザやクエリ チェックなどのオーバーヘッドはありません。
2つのハンドラ要求間でテーブルがロックされる必要はありません。
ハンドラ インターフェースはデータの統一をする必要がありませんので (例えばダーティ リードが許されています)、ストレージ エンジンは SELECT が通常は許容しない最適化機能を利用する事ができます。
ISAM のようなインターフェースを利用するアプリケーションに対しては、HANDLER のおかげでそれらを MySQL にポートするのが簡単になります。
HANDLER のおかげで、SELECT では難しい(または不可能な)方法でデータベースをスキャンする事ができます。データベースに対話式のユーザ インターフェースを提供するアプリケーションを利用する時には、HANDLER インターフェースの方がより自然な方法です。