MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

13.2.4 HANDLER ステートメント

HANDLER tbl_name OPEN [ [AS] alias]

HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]

HANDLER tbl_name CLOSE

HANDLER ステートメントは、テーブルストレージエンジンインタフェースへの直接アクセスを提供します。 これは、InnoDB および MyISAM テーブルに使用できます。

HANDLER ... OPEN ステートメントはテーブルを開き、それを以降の HANDLER ... READ ステートメントを使用してアクセス可能にします。 このテーブルオブジェクトはほかのセッションによって共有されておらず、このセッションが HANDLER ... CLOSE を呼び出すか、またはこのセッションが終了するまでクローズされません。

エイリアスを使用してテーブルを開いた場合は、その開かれたテーブルへのほかの HANDLER ステートメントによるそれ以降の参照は、テーブル名ではなくエイリアスを使用する必要があります。 エイリアスを使用せずに、データベース名で修飾されたテーブル名を使用してテーブルを開く場合、以降の参照では修飾されていないテーブル名を使用する必要があります。 たとえば、mydb.mytable を使用して開いたテーブルの場合、さらに参照するには mytable を使用する必要があります。

最初の HANDLER ... READ 構文は、指定されたインデックスが特定の値を満たし、かつ WHERE 条件が満たされている行をフェッチします。 マルチカラムインデックスがある場合は、インデックスカラム値をカンマ区切りリストとして指定します。 インデックス内のすべてのカラムの値を指定するか、またはインデックスカラムの左端のプリフィクスの値を指定します。 インデックス my_idx に、col_acol_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) ...

HANDLER インタフェースを使用してテーブルの PRIMARY KEY を参照するには、引用符で囲まれた識別子 `PRIMARY` を使用します。

HANDLER tbl_name READ `PRIMARY` ...

2 番目の HANDLER ... READ 構文は、WHERE 条件に一致するインデックス順序でテーブルの行をフェッチします。

3 番目の HANDLER ... READ 構文は、WHERE 条件に一致する自然な行順序でテーブルの行をフェッチします。 これは、フルテーブルスキャンが望ましい場合は、HANDLER tbl_name READ index_name より高速です。 自然な行順序とは、行が MyISAM テーブルデータファイル内に格納されている順序のことです。 このステートメントは InnoDB テーブルに対しても機能しますが、個別のデータファイルが存在しないため、このような概念はありません。

LIMIT 句を使用しない場合は、すべての形式の HANDLER ... READ が単一行 (使用可能な場合) をフェッチします。 特定の行数を返すには、LIMIT 句を含めます。 その構文は、SELECT ステートメントの場合と同じです。 セクション13.2.10「SELECT ステートメント」を参照してください。

HANDLER ... CLOSE は、HANDLER ... OPEN でオープンされたテーブルをクローズします。

通常の SELECT ステートメントの代わりに HANDLER インタフェースを使用する理由として、次のいくつかがあります。

HANDLER は、やや低レベルのステートメントです。 たとえば、一貫性が提供されません。 つまり、HANDLER ... OPEN はテーブルのスナップショットを作成せず、テーブルのロックも行いません。 これは、HANDLER ... OPEN ステートメントが発行されたあと、テーブルデータを (現在のセッションまたはその他のセッションで) 変更することができ、これらの変更が HANDLER ... NEXT または HANDLER ... PREV スキャンに部分的にしか表示されない可能性があることを示します。

開かれたハンドラを閉じ、再度開くようにマークすることができます。その場合、このハンドラはテーブル内の位置を失います。 これは、次の両方の状況が当てはまる場合に発生します。

テーブルに対する TRUNCATE TABLE は、HANDLER OPEN で開かれたそのテーブルのすべてのハンドラを閉じます。

FLUSH TABLES tbl_name WITH READ LOCK でフラッシュされたテーブルが HANDLER で開かれた場合、そのハンドラは暗黙的にフラッシュされ、その位置を失います。