Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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都引用同一个系统变量。

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

  • 对于给定的结构化变量类型,每个实例都必须有唯一的名称,但是实例名称不需要在不同变量类型之间唯一。

  • 结构化变量类型的组件名称必须在所有系统变量名称中唯一。如果不是这样(即两个不同类型的结构化变量可以共享组件成员名称),那么在没有指定实例名称时,无法确定使用哪个默认结构化变量。

  • 如果结构化变量实例名称不是合法的未引号标识符,请将其引用为使用反引号的引号标识符。例如,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';

这是不能在任何简单变量名称出现的上下文中使用结构变量名称的唯一例外。