#### 5.1.9.5 结构化系统变量

结构化变量在两个方面不同于常规系统变量：

-   它的值是一个结构，其中包含指定密切相关的服务器参数的组件。

-   给定类型的结构化变量可能有多个实例。每个都有不同的名称，并引用服务器维护的不同资源。

    MySQL 支持一种结构化变量类型，它指定控制键缓存操作的参数。密钥缓存结构化变量具有以下组件：

-   [`key_buffer_size`](server-system-variables.html#sysvar_key_buffer_size)

-   [`key_cache_block_size`](server-system-variables.html#sysvar_key_cache_block_size)

-   [`key_cache_division_limit`](server-system-variables.html#sysvar_key_cache_division_limit)

-   [`key_cache_age_threshold`](server-system-variables.html#sysvar_key_cache_age_threshold)

    本节介绍引用结构化变量的语法。键缓存变量用于语法示例，但有关键缓存如何操作的具体细节可以在其他地方找到，在[第 8.10.2 节，“MyISAM 密钥缓存”](myisam-key-cache.html).

    要引用结构化变量实例的组件，您可以在*`instance_name.component_name`*格式。例子：


```
hot_cache.key_buffer_size
hot_cache.key_cache_block_size
cold_cache.key_cache_block_size
```

对于每个结构化系统变量，一个名为`默认`总是预定义的。如果您引用结构化变量的组件而没有任何实例名称，则`默认`使用实例。因此，`default.key_buffer_size`和[`key_buffer_size`](server-system-variables.html#sysvar_key_buffer_size)两者都引用相同的系统变量。

结构化变量实例和组件遵循以下命名规则：

-   对于给定类型的结构化变量，每个实例必须具有唯一的名称*之内*该类型的变量。但是，实例名称不必是唯一的*穿过*结构化变量类型。例如，每个结构化变量都有一个名为`默认`， 所以`默认`在变量类型中不是唯一的。

-   每个结构化变量类型的组件名称在所有系统变量名称中必须是唯一的。如果这不是真的（也就是说，如果两种不同类型的结构化变量可以共享组件成员名称），则不清楚使用哪个默认结构化变量来引用未由实例名称限定的成员名称。

-   如果结构化变量实例名称作为不带引号的标识符不合法，请使用反引号将其称为带引号的标识符。例如，`热缓存`不合法，但是`热缓存`是。

-   `全球的`,`会议`， 和`当地的`不是合法的实例名称。这避免了与符号的冲突，例如`@@全球的。*`变量名`*`用于引用非结构化系统变量。

    目前，前两条规则没有被违反的可能性，因为唯一的结构化变量类型是键缓存的类型。如果将来创建某种其他类型的结构化变量，这些规则可能具有更大的意义。

    除了一个例外，您可以在可能出现简单变量名称的任何上下文中使用复合名称来引用结构化变量组件。例如，您可以使用命令行选项为结构化变量赋值：


```
$> mysqld --hot_cache.key_buffer_size=64K
```

在选项文件中，使用以下语法：

```
[mysqld]
hot_cache.key_buffer_size=64K
```

如果使用此选项启动服务器，它会创建一个名为`热缓存`除了默认大小为 8MB 的默认密钥缓存之外，其大小为 64KB。

假设您按如下方式启动服务器：

```
$> mysqld --key_buffer_size=256K \
         --extra_cache.key_buffer_size=128K \
         --extra_cache.key_cache_block_size=2048
```

在这种情况下，服务器将默认密钥缓存的大小设置为 256KB。（你也可以写`--default.key_buffer_size=256K`.) 此外，服务器会创建第二个密钥缓存，名为`额外缓存`它的大小为 128KB，用于缓存表索引块的块缓冲区大小设置为 2048 字节。

以下示例以 3:1:1 大小的三个不同键缓存启动服务器：

```
$> mysqld --key_buffer_size=6M \
         --hot_cache.key_buffer_size=2M \
         --cold_cache.key_buffer_size=2M
```

结构化变量值也可以在运行时设置和检索。例如，要设置一个名为`热缓存`大小为 10MB，请使用以下任一语句：

```
mysql> SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024;
mysql> SET @@GLOBAL.hot_cache.key_buffer_size = 10*1024*1024;
```

要检索缓存大小，请执行以下操作：

```
mysql> SELECT @@GLOBAL.hot_cache.key_buffer_size;
```

但是，以下语句不起作用。该变量不被解释为复合名称，而是作为一个简单的字符串[`喜欢`](string-comparison-functions.html#operator_like)模式匹配操作：

```
mysql> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';
```

这是能够在任何可能出现简单变量名称的地方使用结构化变量名称的例外。
