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_size
和key_buffer_size
都引用同一个系统变量。
结构化变量实例和组件遵循以下命名规则:
-
对于给定的结构化变量类型,每个实例都必须有唯一的名称,但是实例名称不需要在不同变量类型之间唯一。
-
结构化变量类型的组件名称必须在所有系统变量名称中唯一。如果不是这样(即两个不同类型的结构化变量可以共享组件成员名称),那么在没有指定实例名称时,无法确定使用哪个默认结构化变量。
-
如果结构化变量实例名称不是合法的未引号标识符,请将其引用为使用反引号的引号标识符。例如,
hot-cache
不是合法的,但`hot-cache`
是。 -
global
、session
和local
不是合法的实例名称。这避免了使用语法,如@@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';
这是不能在任何简单变量名称出现的上下文中使用结构变量名称的唯一例外。