### 15.20.8 InnoDB memcached 插件内部

#### InnoDB 内存缓存插件的 InnoDB API

这`InnoDB` **内存缓存**引擎访问`InnoDB`通过`InnoDB`API，大部分是从嵌入式直接采用的`InnoDB`.`InnoDB`API 函数被传递给`InnoDB` **内存缓存**引擎作为回调函数。`InnoDB`API 函数访问`InnoDB`表直接，并且大部分是 DML 操作，除了[`截断表`](truncate-table.html).

**内存缓存**命令是通过执行`InnoDB` **内存缓存**API。下表概述了如何**内存缓存**命令映射到 DML 或 DDL 操作。

[](<>)

**表 15.27 memcached 命令和相关的 DML 或 DDL 操作**

| memcached 命令 | DML 或 DDL 操作 |
| ------------ | ------------ |
| `得到` | 读/取命令 |
| `放` | 搜索，然后是`插入`要么`更新`（取决于是否存在密钥） |
| `添加` | 搜索，然后是`插入`要么`更新` |
| `代替` | 搜索，然后是`更新` |
| `附加` | 搜索，然后是`更新`（将数据附加到之前的结果中`更新`) |
| `前置` | 搜索，然后是`更新`（将数据添加到结果之前`更新`) |
| `增量` | 搜索，然后是`更新` |
| `decr` | 搜索，然后是`更新` |
| `删除` | 搜索后跟`删除` |
| `flush_all` | `截断表`(DDL) |

#### InnoDB memcached 插件配置表

[](<>)[](<>)[](<>)[](<>)

本节介绍了使用的配置表`daemon_memcached`插入。这`缓存策略`桌子，`配置选项`表，和`容器`表是由`innodb_memcached_config.sql`中的配置脚本`innodb_memcache`数据库。

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

#### 缓存\_政策表

这`缓存策略`表定义了缓存策略`InnoDB` `内存缓存`安装。您可以为`得到`,`放`,`删除`， 和`冲洗`操作，在单个缓存策略中。所有操作的默认设置是`innodb_only`.

-   `innodb_only`： 采用`InnoDB`作为数据存储。

-   `仅缓存`： 使用**内存缓存**引擎作为数据存储。

-   `缓存`: 两者都用`InnoDB`和**内存缓存**引擎作为数据存储。在这种情况下，如果**内存缓存**在内存中找不到键，它在`InnoDB`桌子。

-   `禁用`: 禁用缓存。

[](<>)

**表 15.28 缓存\_政策专栏**

| 柱子 | 描述 |
| --- | --- |
| `政策名称` | 缓存策略的名称。默认缓存策略名称是`缓存策略`. |
| `获取策略` | 获取操作的缓存策略。有效值为`innodb_only`,`仅缓存`,`缓存`， 要么`禁用`.默认设置是`innodb_only`. |
| `设置策略` | 集合操作的缓存策略。有效值为`innodb_only`,`仅缓存`,`缓存`， 要么`禁用`.默认设置是`innodb_only`. |
| `删除策略` | 删除操作的缓存策略。有效值为`innodb_only`,`仅缓存`,`缓存`， 要么`禁用`.默认设置是`innodb_only`. |
| `刷新策略` | 刷新操作的缓存策略。有效值为`innodb_only`,`仅缓存`,`缓存`， 要么`禁用`.默认设置是`innodb_only`. |

#### 配置\_选项表

这`配置选项`餐桌商店**内存缓存**- 可以在运行时使用 SQL 更改的相关设置。支持的配置选项是`分隔器`和`table_map_delimiter`.

[](<>)

**表 15.29 配置\_选项栏**

| 柱子 | 描述 |
| --- | --- |
| `姓名` | 的名称**内存缓存**- 相关的配置选项。支持以下配置选项`配置选项`桌子：<br/><br/>* `分隔器`: 用于在有多个时将长字符串的值分隔成单独的值`值列`定义。默认情况下，`分隔器`是一个`|`特点。例如，如果您定义`col1, col2`作为值列，您定义`|`作为分隔符，您可以发出以下命令**内存缓存**将值插入的命令`col1`和`col2`， 分别：<br/><br/>  `<br/> 设置keyx 10 0 19<br/> valuecolx|valuecoly<br/>`<br/><br/>  `值col1x`存储在`col1`和`价值链`存储在`col2`.<br/><br/>* `table_map_delimiter`: 使用时分隔模式名和表名的字符`@@`键名中的表示法以访问特定表中的键。例如，`@@t1.some_key`和`@@t2.some_key`具有相同的键值，但存储在不同的表中。 |
| `价值` | 赋值给**内存缓存**- 相关的配置选项。 |

#### 容器表

这`容器`table 是三个配置表中最重要的一个。每个`InnoDB`用于存储的表**内存缓存**值必须在`容器`桌子。该条目提供之间的映射`InnoDB`表列和容器表列，这是必需的`内存缓存`跟...共事`InnoDB`表。

这`容器`表包含一个默认条目`test.demo_test`表，由`innodb_memcached_config.sql`配置脚本。要使用`daemon_memcached`用你自己的插件`InnoDB`表，您必须在`容器`桌子。

[](<>)

**表 15.30 容器列**

| 柱子 | 描述 |  |
| --- | --- | --- |
| `姓名` | 赋予容器的名称。如果`InnoDB`表不是按名称请求的`@@`符号，`daemon_memcached`插件使用`InnoDB`表与`容器名称`的价值`默认`.如果没有这样的条目，则在第一个条目`容器`表，按字母顺序排列`姓名`（升序），确定默认值`InnoDB`桌子。 |  |
| `db_schema` | 所在数据库的名称`InnoDB`表驻留。这是一个必需的值。 |  |
| `db_table` | 的名称`InnoDB`存储表**内存缓存**价值观。这是一个必需的值。 |  |
| `键列` | 中的列`InnoDB`包含查找键值的表**内存缓存**操作。这是一个必需的值。 |  |
| `值列` | 这`InnoDB`存储的表列（一个或多个）`内存缓存`数据。可以使用指定的分隔符指定多个列`innodb_memcached.config_options`桌子。默认情况下，分隔符是竖线字符（“ | ”）。要指定多列，请使用定义的分隔符分隔它们。例如：`col1|col2|col3`.这是一个必需的值。 |
| `旗帜` | 这`InnoDB`用作标志的表列（与主值一起存储和检索的用户定义的数值）**内存缓存**.标志值可以用作某些操作的列说明符（例如`增量`,`前置`） 如果一个**内存缓存**value 映射到多个列，以便对指定列执行操作。例如，如果您映射了一个`值列`到三个`InnoDB`表列，并且只希望对一列执行增量操作，请使用`旗帜`列来指定列。如果您不使用`旗帜`列，设置一个值`0`表示它未使用。 |  |
| `cas_column` | 这`InnoDB`存储比较和交换 (cas) 值的表列。这`cas_column`价值与方式有关**内存缓存**散列对不同服务器的请求并将数据缓存在内存中。因为`InnoDB` **内存缓存**插件与单个紧密集成**内存缓存**守护进程，内存缓存机制由 MySQL 和[InnoDB 缓冲池](glossary.html#glos_buffer_pool)，很少需要此列。如果不使用此列，请将值设置为`0`表示它未使用。 |  |
| `expire_time_column` | 这`InnoDB`存储过期值的表列。这`expire_time_column`价值与方式有关**内存缓存**散列对不同服务器的请求并将数据缓存在内存中。因为`InnoDB` **内存缓存**插件与单个紧密集成**内存缓存**守护进程，内存缓存机制由 MySQL 和[InnoDB 缓冲池](glossary.html#glos_buffer_pool)，很少需要此列。如果不使用此列，请将值设置为`0`表示该列未使用。最大过期时间定义为`INT_MAX32`或 2147483647 秒（大约 68 年）。 |  |
| `unique_idx_name_on_key` | 键列上的索引名称。它必须是唯一索引。它可以是[首要的关键](glossary.html#glos_primary_key)或一个[二级索引](glossary.html#glos_secondary_index).最好使用主键`InnoDB`桌子。使用主键可以避免使用二级索引时执行的查找。你不能做一个[覆盖指数](glossary.html#glos_covering_index)为了**内存缓存**查找；`InnoDB`如果您尝试在键和值列上定义复合二级索引，则会返回错误。 |  |

##### 容器表列约束

-   您必须为`db_schema`,`数据库名称`,`键列`,`值列`和`unique_idx_name_on_key`.指定`0`为了`旗帜`,`cas_column`， 和`expire_time_column`如果它们未使用。否则可能会导致您的设置失败。

-   `键列`: 最大限制**内存缓存**密钥为 250 个字符，由**内存缓存**.映射的键必须是非 Null[`字符`](char.html)要么[`VARCHAR`](char.html)类型。

-   `值列`: 必须映射到[`字符`](char.html),[`VARCHAR`](char.html)， 要么[`斑点`](blob.html)柱子。没有长度限制，值可以为 NULL。

-   `cas_column`： 这`cas`值是一个 64 位整数。它必须映射到[`大整数`](integer-types.html)至少 8 个字节。如果不使用此列，请将值设置为`0`表示它未使用。

-   `过期时间列`: 必须映射到[`整数`](integer-types.html)至少 4 个字节。到期时间定义为 Unix 时间的 32 位整数（自 1970 年 1 月 1 日以来的秒数，作为 32 位值），或从当前时间开始的秒数。对于后者，秒数不得超过 60\*60\*24\*30（30 天的秒数）。如果客户端发送的数字较大，则服务器将其视为真实的 Unix 时间值，而不是与当前时间的偏移量。如果不使用此列，请将值设置为`0`表示它未使用。

-   `旗帜`: 必须映射到[`整数`](integer-types.html)至少 32 位，可以为 NULL。如果不使用此列，请将值设置为`0`表示它未使用。

    在插件加载时执行预检查以强制列约束。如果发现不匹配，则不会加载插件。

##### 多值列映射

-   在插件初始化期间，当`InnoDB` **内存缓存**配置有在定义的信息`容器`表中定义的每个映射列`容器.value_columns`根据映射验证`InnoDB`桌子。如果多个`InnoDB`表列被映射，有一个检查以确保每个列存在并且是正确的类型。

-   在运行时，对于`内存缓存`插入操作，如果分隔值多于映射列的数量，则只取映射值的数量。例如，如果有六个映射列，并且提供了七个分隔值，则仅采用前六个分隔值。第七个分隔值被忽略。

-   如果分隔值少于映射列，则未填充的列将设置为 NULL。如果无法将未填充的列设置为 NULL，则插入操作将失败。

-   如果表的列多于映射值，则额外的列不会影响结果。

#### 演示\_测试示例表

这`innodb_memcached_config.sql`配置脚本创建一个`演示测试`表中的`测试`数据库，可用于验证`InnoDB` **内存缓存**安装后立即安装插件。

这`innodb_memcached_config.sql`配置脚本还为`演示测试`表中的`innodb_memcache.containers`桌子。

```
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 |
+----+------------------+------+------+------+
```
