HANDLERtbl_name
OPEN [ ASalias
] HANDLERtbl_name
READindex_name
{ = | >= | <= | < } (value1
,value2
,...) [ WHEREwhere_condition
] [LIMIT ... ] HANDLERtbl_name
READindex_name
{ FIRST | NEXT | PREV | LAST } [ WHEREwhere_condition
] [LIMIT ... ] HANDLERtbl_name
READ { FIRST | NEXT } [ WHEREwhere_condition
] [LIMIT ... ] HANDLERtbl_name
CLOSE
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
ステートメントと同じ構文を持ちます。詳しくは
項12.2.7. 「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
インターフェースの方がより自然な方法です。