MySQL 8.0 リファレンスマニュアル


15.20.8 InnoDB memcached プラグインの内部

InnoDB memcached プラグイン用の InnoDB API

InnoDB memcached エンジンは、埋込み InnoDB から直接採用された InnoDB API を介して InnoDB にアクセスします。 InnoDB API 関数は、コールバック関数として InnoDB memcached エンジンに渡されます。 InnoDB API 関数は、InnoDB テーブルに直接アクセスします。ほとんどの場合、DML 操作ですが、TRUNCATE TABLE は例外です。

memcached コマンドは、InnoDB memcached API を介して実装されます。 次のテーブルに、memcached コマンドが DML または DDL 操作にどのようにマップされるかを示します。

表 15.27 memcached コマンドおよび関連する DML または DDL 操作

memcached コマンド DML または DDL 操作
get 読み取り/フェッチコマンド
set INSERT または UPDATE が続く検索 (キーが存在するかどうかによる)
add INSERT または UPDATE が続く検索
replace UPDATE が続く検索
append 検索の後に UPDATE が続きます (UPDATE の前に結果にデータを追加します)
prepend 検索の後に UPDATE が続く (UPDATE の前にデータを結果の先頭に付加する)
incr UPDATE が続く検索
decr UPDATE が続く検索
delete DELETE が続く検索
flush_all TRUNCATE TABLE (DDL)

InnoDB memcached プラグインの構成テーブル

このセクションでは、daemon_memcached プラグインで使用される構成テーブルについて説明します。 cache_policies テーブル、config_options テーブルおよび containers テーブルは、innodb_memcache データベースの innodb_memcached_config.sql 構成スクリプトによって作成されます。

mysql> USE innodb_memcache;
Database changed
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies            |
| config_options            |
| containers                |
+---------------------------+

cache_policies テーブル

cache_policies テーブルでは、InnoDB memcached インストールのキャッシュポリシーを定義します。 単一のキャッシュポリシー内で、get, set, delete および flush 操作の個々のポリシーを指定できます。 すべての操作のデフォルト設定は innodb_only です。

  • innodb_only: InnoDB をデータストアとして使用します。

  • cache_only: memcached エンジンをデータストアとして使用します。

  • caching: InnoDBmemcached エンジンの両方をデータストアとして使用します。 この状況で、memcached がメモリー内からキーを検出できない場合、InnoDB テーブル内から値を検索します。

  • disable: キャッシュを無効にします。

表 15.28 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 です。

表 15.29 config_options カラム

カラム 説明
Name memcached 関連の構成オプションの名前。 config_options テーブルでは、次の構成オプションがサポートされています:
  • separator: 複数の value_columns が定義されている場合に、1 つの長い文字列の値を別々の値に分離するために使用します。 デフォルトでは、separator| 文字です。 たとえば、col1, col2 を値カラムとして定義し、|をセパレータとして定義する場合、次の memcached コマンドを発行して、col1 および col2 にそれぞれ値を挿入できます:

    set keyx 10 0 19
    valuecolx|valuecoly

    valuecol1xcol1 に格納され、valuecolycol2 に格納されます。

  • table_map_delimiter: 特定のテーブル内のキーにアクセスするために、キー名に @@ 表記を使用するときの、スキーマ名とテーブル名を区切る文字。 たとえば、@@t1.some_key@@t2.some_key は同じキー値を持っていますが、異なるテーブルに格納されます。

memcached 関連の構成オプションに割り当てられた値。

containers テーブル

containers テーブルは、3 つの構成テーブルの中で最も重要です。 memcached 値の格納に使用される各 InnoDB テーブルには、containers テーブルのエントリが必要です。 このエントリは、InnoDB テーブルのカラムとコンテナテーブルのカラムの間のマッピングを提供します。これは、memcachedInnoDB テーブルを操作するために必要です。

containers テーブルには、innodb_memcached_config.sql 構成スクリプトによって作成される test.demo_test テーブルのデフォルトエントリが含まれています。 独自の InnoDB テーブルで daemon_memcached プラグインを使用するには、containers テーブルにエントリを作成する必要があります。

表 15.30 containers のカラム

カラム 説明
name コンテナに付与された名前。 @@テーブル記法を使用して名前で InnoDB テーブルがリクエストされない場合、daemon_memcached プラグインは containers.name 値が defaultInnoDB テーブルを使用します。 このようなエントリがない場合は、containers テーブルの最初のエントリが name (昇順) でアルファベット順に並べられて、デフォルトの InnoDB テーブルが決定されます。
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 値が複数のカラムにマップされている場合、フラグ値を一部の操作 (incrprepend など) のカラム指定子として使用して、指定したカラムに対して操作を実行できます。 たとえば、value_columns を 3 つの InnoDB テーブルのカラムにマップし、一方のカラムに対してのみ増分操作を実行する場合は、flags カラムを使用してカラムを指定します。 flags カラムを使用しない場合は、未使用であることを示す 0 の値を設定します。
cas_column 比較およびスワップ (cas) 値を格納する InnoDB テーブルのカラム。 cas_column の値は、memcached が異なるサーバーにリクエストをハッシュし、データをメモリーにキャッシュする方法に関連しています。 InnoDB memcached プラグインは単一の memcached デーモンと緊密に統合されており、インメモリーキャッシュメカニズムは MySQL および InnoDB buffer pool によって処理されるため、このカラムはほとんど必要ありません。 このカラムを使用しない場合は、0 の値を設定して未使用であることを示します。
expire_time_column 有効期限の値を格納する InnoDB テーブルのカラム。 expire_time_column の値は、memcached が異なるサーバーにリクエストをハッシュし、データをメモリーにキャッシュする方法に関連しています。 InnoDB memcached プラグインは単一の memcached デーモンと緊密に統合されており、インメモリーキャッシュメカニズムは MySQL および InnoDB buffer pool によって処理されるため、このカラムはほとんど必要ありません。 このカラムを使用しない場合は、0 の値を設定して、カラムが未使用であることを示します。 最大有効期限は、INT_MAX32 または 2147483647 秒 (約 68 年) として定義されます。
unique_idx_name_on_key キーカラムのインデックスの名前。 これは一意のインデックスである必要があります。 これは主キーまたはセカンダリインデックスにできます。 できれば、InnoDB テーブルの主キーを使用してください。 主キーを使用すると、セカンダリインデックスの使用時に実行されるルックアップが回避されます。 memcached 参照のためのカバリングインデックスは作成できません。キーカラムおよび値カラムの両方に複合セカンダリインデックスを定義しようとすると、InnoDB はエラーを返します。

containers テーブルカラムの制約
  • db_schemadb_namekey_columnsvalue_columns、および unique_idx_name_on_key の値を指定する必要があります。 flagscas_column、および expire_time_column が使用されない場合、これらに 0 を指定します。 そうしないと、セットアップが失敗する場合があります。

  • key_columns: memcached で強制される、memcached キーの最大長は 250 文字です。 マップ済みのキーは、Null 以外の CHAR または VARCHAR タイプである必要があります。

  • value_columns: CHARVARCHAR、または 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 の値を設定して未使用であることを示します。

カラム制約を強制するために、プラグインのロード時に事前検査が行われます。 不一致が見つかった場合、プラグインはロードされません。

複数値カラムマッピング
  • プラグインの初期化時に、InnoDB memcachedcontainers テーブルで定義された情報で構成されている場合、containers.value_columns で定義された各マップ済カラムは、マップ済 InnoDB テーブルに対して検証されます。 複数の InnoDB テーブルのカラムがマップされている場合は、各カラムが存在し、正しい型であることを確認するチェックがあります。

  • 実行時に、memcached の挿入操作では、マップされたカラムの数よりもデリミタ付きの値が多い場合、マップされた値の数のみが取得されます。 たとえば、マッピングされたカラムが 6 つあり、7 つの区切り値が指定されている場合、最初の 6 つの区切り値のみが使用されます。 7 番目の区切り値は無視されます。

  • マップされたカラムより区切られた値の方が少ない場合、入力値のないカラムは NULL に設定されます。 未入力のカラムを NULL に設定できない場合、挿入操作は失敗します。

  • テーブルにマップされた値より多くのカラムがある場合、余分なカラムは結果に影響しません。

demo_test のサンプルテーブル

innodb_memcached_config.sql 構成スクリプトにより、test データベースに demo_test テーブルが作成され、これを使用して、設定後すぐに InnoDB memcached プラグインのインストールを検証できます。

innodb_memcached_config.sql 構成スクリプトでは、innodb_memcache.containers テーブルに demo_test テーブルのエントリも作成されます。

mysql> SELECT * FROM innodb_memcache.containers\G
*************************** 1. row ***************************
                  name: aaa
             db_schema: test
              db_table: demo_test
           key_columns: c1
         value_columns: c2
                 flags: c3
            cas_column: c4
    expire_time_column: c5
unique_idx_name_on_key: PRIMARY

mysql> SELECT * FROM test.demo_test;
+----+------------------+------+------+------+
| c1 | c2               | c3   | c4   | c5   |
+----+------------------+------+------+------+
| AA | HELLO, HELLO     |    8 |    0 |    0 |
+----+------------------+------+------+------+

関連キーワード:  InnoDB, テーブル, カラム, 構成, 操作, 設定, マップ, containers, only, インデックス