InnoDB memcached プラグイン用の InnoDB API
InnoDB
memcached エンジンは InnoDB
API を介して InnoDB
にアクセスします。ほとんどの API は、組み込まれた InnoDB
から直接採用されます。InnoDB
API 関数は、「コールバック関数」として InnoDB
memcached に渡されます。InnoDB
API 関数は InnoDB
テーブルに直接アクセスし、TRUNCATE TABLE
操作を除いてほとんどが DML 操作です。
次にリストされたすべての memcached コマンドは、 InnoDB
memcached API によって実装されます。次の表は、それぞれの memcached コマンドが DML 操作にどのようにマップされるかの概要を示しています。
表 14.10 memcached コマンドおよび関連付けられた DML 操作
memcached コマンド | DML 操作 |
---|---|
get |
読み取り/フェッチコマンド |
set |
検索後に挿入または更新を実行する (キーが存在するかどうかに依存する) |
add |
検索後に挿入または更新を実行する |
replace |
検索後に更新を実行する |
append |
検索後に更新を実行する (更新前に結果の後ろにデータを付加する) |
prepend |
検索後に更新を実行する (更新前に結果の前にデータを付加する) |
incr |
検索後に更新を実行する |
decr |
検索後に更新を実行する |
delete |
検索後に削除を実行する |
flush_all |
テーブルを削除する |
InnoDB memcached プラグインで使用される基礎テーブル
このセクションでは、InnoDB
memcached プラグインによって使用される基礎テーブルについて説明します。
innodb_memcached_config.sql
構成スクリプトは InnoDB
memcached プラグインによって必要となる 3 つのテーブルをインストールします。テーブルは専用の innodb_memcache
データベースに作成されます。
mysql> USE innodb_memcache;
Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies |
| config_options |
| containers |
+---------------------------+
3 rows in set (0.01 sec)
containers テーブル
containers
テーブルは 3 つのテーブルの中でもっとも重要です。このテーブル内のエントリは、memcached 値を格納するために使用される InnoDB
テーブル用の「コンテナ」です。コンテナは、InnoDB
テーブルのカラムを下記の表で示す値にマップします。このマッピングは memcached
が InnoDB
テーブルと一緒に機能するために必要です。
containers
テーブルには test.demo_test
テーブル用のデフォルトエントリがあります。InnoDB
memcached プラグインを独自の InnoDB
テーブルと一緒に使用するには、使用するテーブルのエントリを containers
テーブルに追加する必要があります。
表 14.11 containers のカラム
カラム | 説明 |
---|---|
name |
コンテナに付与された名前。 |
db_schema |
InnoDB テーブルが存在するデータベースの名前。これは必須の値です。 |
db_table |
memcached 値を格納する InnoDB テーブルの名前。これは必須の値です。 |
key_columns |
memcached 操作のための検索キー値を格納する InnoDB テーブルのカラム。これは必須の値です。 |
value_columns |
memcached データを格納する InnoDB テーブル内のカラム (1 つ以上)。innodb_memcached.config_options テーブルで指定された区切り文字を使用して複数のカラムを指定できます。デフォルトでは、区切り文字はパイプ文字 (「|」) です。複数カラムを指定するには、定義された区切り文字でカラムを区切ります。たとえば、col1|col2|col3 となります。これは必須の値です。 |
flags |
memcached のフラグ (メインの値と一緒に格納および取得されるユーザー定義の数値) として使用される InnoDB テーブル内のカラムを指定します。memcached 値が複数カラムにマップされる場合、フラグ値はいくつかの操作 (incr や prepend など) のカラム指定子として使用でき、その結果、指定されたカラムで操作が実行されます。たとえば、3 つのカラムに値をマップしていて、これらのカラムのうちの 1 つでインクリメント操作が実行する場合に、これらの操作に使用するカラムを指定するには flags を使用できます。flags カラムを使用しない場合は、未使用であることを示すためにその値を 0 に設定します。 |
cas_column |
比較およびスワップ (cas) 値を格納する InnoDB テーブル内のカラム。cas_column 値と expire_time_column 値は、memcached が別のサーバーへのリクエストをハッシュし、データをメモリーにキャッシュする方法に関係します。InnoDB memcached プラグインは単一の memcached デーモンに強固に統合され、インメモリーキャッシュメカニズムは MySQL およびバッファープールによって処理されるため、このタイプの配備でこれらのカラムはほとんど必要ありません。これらのカラムを使用しない場合、値を 0 に設定してカラムが未使用であることを示します。 |
expire_time_column |
有効期限の値を格納する InnoDB テーブル内のカラム。cas_column 値と expire_time_column 値は、memcached が別のサーバーへのリクエストをハッシュし、データをメモリーにキャッシュする方法に関係します。InnoDB memcached プラグインは単一の memcached デーモンに強固に統合され、インメモリーキャッシュメカニズムは MySQL およびバッファープールによって処理されるため、このタイプの配備でこれらのカラムはほとんど必要ありません。これらのカラムを使用しない場合、値を 0 に設定してカラムが未使用であることを示します。 |
unique_idx_name_on_key |
キーカラムのインデックスの名前。これは一意のインデックスである必要があります。これは主キーまたはセカンダリインデックスにできます。できれば、キーカラムを InnoDB テーブルの主キーにしてください。こうすることで、このカラムに対してセカンダリインデックスを使用するための検索ステップが省かれます。memcached 参照のためのカバリングインデックスは作成できません。キーカラムおよび値カラムの両方に複合セカンダリインデックスを定義しようとすると、InnoDB はエラーを返します。 |
containers テーブルカラムの制約
db_schema
、db_name
、key_columns
、value_columns
、およびunique_idx_name_on_key
の値を指定する必要があります。そうしない場合、セットアップは失敗します。flags
、cas_column
、およびexpire_time_column
が使用されない場合、これらに0
を指定します。そうしないと、セットアップが失敗する場合があります。key_columns
: memcached で強制される、memcached キーの最大長は 250 文字です。最大長を超えるマップ済みのキーが使用された場合、操作は失敗します。マップ済みのキーは、Null 以外のCHAR
またはVARCHAR
タイプである必要があります。value_columns
:CHAR
、VARCHAR
、またはBLOB
カラムにマップされる必要があります。長さに制約はなく、値を NULL に指定できます。cas_column
:cas
値は 64 ビットの整数です。これは少なくとも 8 バイトのBIGINT
にマップされる必要があります。このカラムを使用しない場合は、未使用であることを示すためにその値を0
に設定します。expiration_time_column
: 少なくとも 4 バイトのINTEGER
にマップされる必要があります。有効期限は、Unix 時間の 32 ビット整数 (1970 年 1 月 1 日からの秒数の 32 ビット値) として、または現在時間から開始する秒数として定義されます。後者の場合、秒数は 60*60*24*30 (30 日間の秒数) を超えないようにしてください。クライアントによって送信された数値の方が大きい場合、サーバーは現在時間からのオフセットではなく実際の Unix 時間の値とみなします。このカラムを使用しない場合は、未使用であることを示すためにその値を0
に設定します。flags
: 少なくとも 32 ビットのINTEGER
にマップする必要があり、NULL に指定できます。このカラムを使用しない場合は、未使用であることを示すためにその値を0
に設定します。
カラム制約を強制するために、プラグインのロード時に事前検査が行われます。不一致が見つかった場合、プラグインはロードされません。
cache_policies テーブル
cache_policies
テーブルは、InnoDB
memcached
セットアップ用のキャッシュポリシーを定義します。単一のキャッシュポリシー内で、get、set、delete、および flush 操作に対する個々のポリシーを指定できます。すべての操作のデフォルト設定は innodb_only
です。
innodb_only
:InnoDB
を memcached のデータストアとして使用します。cache-only
: 従来の memcached エンジンをデータストアとして使用します。innodb_only
:InnoDB
と従来の memcached エンジンの両方をデータストアとして使用します。この状況で、memcached がメモリー内からキーを検出できない場合、InnoDB
テーブル内から値を検索します。disable
: キャッシュを無効にします。
表 14.12 cache_policies カラム
カラム | 説明 |
---|---|
policy_name |
キャッシュポリシーの名前。デフォルトのキャッシュポリシー名は cache_policy です。 |
get_policy |
get 操作のキャッシュポリシー。有効な値は、innodb_only 、cache-only 、caching 、または disabled です。デフォルト設定は innodb_only です。 |
set_policy |
set 操作のキャッシュポリシー。有効な値は、innodb_only 、cache-only 、caching 、または disabled です。デフォルト設定は innodb_only です。 |
delete_policy |
delete 操作のキャッシュポリシー。有効な値は、innodb_only 、cache-only 、caching 、または disabled です。デフォルト設定は innodb_only です。 |
flush_policy |
flush 操作のキャッシュポリシー。有効な値は、innodb_only 、cache-only 、caching 、または disabled です。デフォルト設定は innodb_only です。 |
config_options テーブル
config_options
テーブルは、SQL を使用して実行時に変更できる memcached 関連の設定を格納します。現時点でサポートされる構成オプションは、separator
および table_map_delimiter
です。
表 14.13 config_options カラム
カラム | 説明 |
---|---|
Name |
memcached 関連の構成オプションの名前。現時点では、次の構成オプションが config_options テーブル経由でサポートされます。
|
Value |
memcached 関連の構成オプションに割り当てられた値。 |
複数カラムのマッピング
プラグインの初期化中に、
InnoDB
memcached が、containers
テーブル内に定義されている情報を使用して構成されるとき、value_columns
から構文解析されるマップされた各カラムは、マップされたテーブルに照らして検証されます。複数カラムがマップされる場合、カラムがそれぞれ存在し、正しいタイプであるかどうかを確認するための検査があります。実行時に、
memcached
挿入操作で、マップされたカラムの数よりも多くの区切り文字が値に存在する場合、マップされた値の数のみが取得されます。たとえば、マップされたカラムが 6 つで、区切られた値が 7 つ提供された場合、最初の 6 つの区切られた値のみが取得されます。7 番目の区切られた値は無視されます。マップされたカラムより区切られた値の方が少ない場合、入力値のないカラムは NULL に設定されます。未記入カラムを NULL に指定できない場合、挿入は失敗します。
マップされた値より多くのカラムがテーブルにある場合、余分なカラムは出力結果に影響を及ぼしません。
テーブルの例
innodb_memcached_config.sql
構成スクリプトは、例として test
データベース内にテーブル demo_test
を作成します。また、追加のテーブルを作成することなく InnoDB
memcached プラグインをただちに動作させることもできます。
container
テーブルのエントリは、上記のいずれの目的で、どのカラムが使用されるかを定義します。
mysql> select * from innodb_memcache.containers;
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| name | db_schema | db_table | key_columns | value_columns | flags | cas_column | expire_time_column | unique_idx_name_on_key |
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
| aaa | test | demo_test | c1 | c2 | c3 | c4 | c5 | PRIMARY |
+------+-----------+-----------+-------------+---------------+-------+------------+--------------------+------------------------+
1 row in set (0.00 sec)
mysql> desc test.demo_test;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| c1 | varchar(32) | NO | PRI | | |
| c2 | varchar(1024) | YES | | NULL | |
| c3 | int(11) | YES | | NULL | |
| c4 | bigint(20) unsigned | YES | | NULL | |
| c5 | int(11) | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
テーブル ID がキー名の @@
表記によってリクエストされない場合は、次のようになります。
ある行の
name
値がdefault
の場合、対応するテーブルが memcached プラグインによって使用されます。したがって、innodb_memcache.containers
の最初のエントリをdemo_test
テーブルより後ろに移動させた場合、name
値にdefault
を使用します。default
のinnodb_memcache.containers.name
値が存在しない場合、アルファベット順で先頭のname
値を持つ行が使用されます。