結構化變數與一般系統變數的兩個不同之處在於:
其值是一個結構,其中包含指定伺服器參數的元件,這些參數被認為是密切相關的。
給定類型的結構化變數可能有多個執行個體。每個執行個體都有不同的名稱,並參照伺服器維護的不同資源。
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
都參照相同的系統變數。
結構化變數執行個體和元件遵循下列命名規則:
對於給定類型的結構化變數,每個執行個體都必須具有在該類型變數內唯一的名稱。但是,執行個體名稱不需要在結構化變數類型之間唯一。例如,每個結構化變數都有一個名為
default
的執行個體,因此default
在變數類型之間不是唯一的。每個結構化變數類型的元件名稱在所有系統變數名稱中都必須是唯一的。如果情況並非如此(也就是說,如果兩種不同類型的結構化變數可以共用元件成員名稱),則不清楚對於未經執行個體名稱限定的成員名稱參照應使用哪個預設結構化變數。
如果結構化變數執行個體名稱不是合法的未加引號的識別碼,請使用反引號將其作為加引號的識別碼參照。例如,
hot-cache
不是合法的,但`hot-cache`
是。global
、session
和local
不是合法的執行個體名稱。這可以避免與諸如@@GLOBAL.
之類的符號表示法產生衝突,該表示法用於參照非結構化系統變數。var_name
目前,前兩個規則沒有任何違反的可能性,因為唯一的結構化變數類型是金鑰快取的結構化變數類型。如果未來建立其他類型的結構化變數,這些規則可能會變得更加重要。
除了例外情況外,您可以在任何可以使用簡單變數名稱的情況下,使用複合名稱來參照結構化變數元件。例如,您可以使用命令列選項為結構化變數指派值:
$> mysqld --hot_cache.key_buffer_size=64K
在選項檔案中,使用下列語法:
[mysqld]
hot_cache.key_buffer_size=64K
如果您使用此選項啟動伺服器,除了預設大小為 8MB 的預設金鑰快取之外,它還會建立一個名為 hot_cache
的金鑰快取,其大小為 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
。)此外,伺服器還會建立第二個名為 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';
這是少數幾個可以使用結構化變數名稱取代簡單變數名稱的例外情況。