Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Structured System Variables

7.1.9.5 结构化系统变量

结构化变量与普通系统变量有两个方面的区别:

  • 其值是一个结构体,具有指定服务器参数的组件,认为是紧密相关的。

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

MySQL支持一种结构化变量类型,该类型指定了键缓存的操作参数。键缓存结构化变量具有以下组件:

本节描述了结构化变量的语法。键缓存变量用于语法示例,但关于键缓存操作的具体细节可以在第10.10.2节“MyISAM键缓存”中找到。

要引用结构化变量实例的组件,可以使用复合名称,以instance_name.component_name格式。示例:

hot_cache.key_buffer_size
hot_cache.key_cache_block_size
cold_cache.key_cache_block_size

对于每个结构化系统变量,总是预定义了一个名为default的实例。如果您引用结构化变量的组件而不指定实例名称,则使用default实例。因此,default.key_buffer_sizekey_buffer_size都引用同一个系统变量。

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

  • 对于给定的结构化变量类型,每个实例的名称必须在该类型的变量中是唯一的。但是,实例名称不需要跨结构化变量类型是唯一的。例如,每个结构化变量都有一个名为default的实例,因此default在变量类型之间不是唯一的。

  • 每个结构化变量类型的组件名称必须在所有系统变量名称中是唯一的。如果这不是真的(即,如果两个不同的结构化变量类型可以共享组件成员名称),那么对于未经实例名称限定成员名称的引用,将不清楚使用哪个默认结构化变量。

  • 如果结构化变量实例名称不是合法的未引号标识符,可以使用反引号引用它。例如,hot-cache不是合法的,但`hot-cache`是。

  • globalsessionlocal不是合法的实例名称。这避免了与诸如@@GLOBAL.var_name的符号冲突,用于引用非结构化系统变量。

目前,前两个规则不可能被违反,因为只有一个结构化变量类型,即键缓存类型。这些规则可能在将来创建其他类型的结构化变量时变得更加重要。

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

$> mysqld --hot_cache.key_buffer_size=64K

在选项文件中,使用以下语法:

[mysqld]
hot_cache.key_buffer_size=64K

如果您使用该选项启动服务器,它将创建一个名为hot_cache的键缓存,大小为64KB,除了默认键缓存的默认大小为8MB。

假设您以以下方式启动服务器:

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

在这种情况下,服务器将默认键缓存的大小设置为256KB。(您也可以写--default.key_buffer_size=256K。)此外,服务器还创建了一个名为extra_cache的键缓存,大小为128KB,块缓存大小为2048字节。

以下示例启动服务器,具有三个不同的键缓存,大小比例为3:1:1:

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

结构化变量值也可以在运行时设置和检索。例如,要将名为hot_cache的键缓存大小设置为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;

但是,以下语句不起作用。变量不是作为复合名称解释的,而是作为简单字符串用于LIKE模式匹配操作:

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

这是在简单变量名称可以出现的任何地方使用结构化变量名称的异常。