相知MySQL(二):系統變數

系統變數簡介

MySQL伺服器程式執行過程中會用到許多影響程式行為的變數,它們被稱為MySQL系統變數,比如允許同時連入的客戶端數量用系統變數max_connections表示,表的預設儲存引擎用系統變數default_storage_engine表示,查詢快取的大小用系統變數query_cache_size表示,等等。每個系統變數都有一個預設值,我們可以使用命令列或者配置檔案中的選項在啟動伺服器時改變一些系統變數的值。大多數的系統變數的值也可以在程式執行過程中修改,而無需停止並重新啟動它。

系統變數詳解

檢視系統變數

我們可以使用下列命令檢視MySQL伺服器程式支援的系統變數以及它們的當前值:

SHOW VARIABLES [LIKE 匹配的模式];

由於系統變數實在太多了,如果我們直接使用SHOW VARIABLES檢視的話就直接刷屏了,所以通常都會帶一個LIKE過濾條件來檢視我們需要的系統變數的值,比方說這麼寫:

mysql> SHOW VARIABLES LIKE ‘default_storage_engine’;

相知MySQL(二):系統變數

mysql> SHOW VARIABLES like ‘max_connections’;

相知MySQL(二):系統變數

可以看到,現在伺服器程式使用的預設儲存引擎就是InnoDB,允許同時連線的客戶端數量最多為151。別忘了LIKE表示式後邊可以跟萬用字元來進行模糊查詢,也就是說我們可以這麼寫:

mysql> SHOW VARIABLES LIKE ‘character%’;

相知MySQL(二):系統變數

這樣就查出了所有以character開頭的系統變數的值。

設定系統變數

透過啟動選項設定

大部分的系統變數都可以透過啟動伺服器時傳送啟動選項的方式來進行設定。如何填寫啟動選項可以看這篇文章相知MySQL(一):啟動選項與配置 ,就是下邊兩種方式:

透過命令列新增啟動選項。比方說我們在啟動伺服器程式時用這個命令:mysqld ——default-storage-engine=MyISAM ——max-connections=10

透過配置檔案新增啟動選項。我們可以這樣填寫配置檔案:[server]default-storage-engine=MyISAMmax-connections=10

當使用上邊兩種方式中的任意一種啟動伺服器程式後,我們再來檢視一下系統變數的值:

mysql> SHOW VARIABLES LIKE ‘default_storage_engine’;+————————————+————+| Variable_name          | Value  |+————————————+————+| default_storage_engine | MyISAM |+————————————+————+1 row in set (0。00 sec)

mysql> SHOW VARIABLES LIKE ‘max_connections’;+————————-+————-+| Variable_name   | Value |+————————-+————-+| max_connections | 10    |+————————-+————-+1 row in set (0。00 sec)

可以看到default_storage_engine和max_connections這兩個系統變數的值已經被修改了。有一點需要注意的是,對於啟動選項來說,如果啟動選項名由多個單片語成,各個單詞之間用短劃線-或者下劃線_連線起來都可以,但是它對應的系統變數的單詞之間必須使用下劃線_連線起來。

伺服器程式執行過程中設定

系統變數比較厲害的一點就是,對於大部分系統變數來說,它們的值可以在伺服器程式執行過程中進行動態修改而無需停止並重啟伺服器。不過系統變數有作用範圍之分。

設定不同作用範圍的系統變數

我們前邊說過,多個客戶端程式可以同時連線到一個伺服器程式。對於同一個系統變數,我們有時想讓不同的客戶端有不同的值。比方說小劉使用客戶端A,他想讓當前客戶端對應的預設儲存引擎為InnoDB,所以他可以把系統變數default_storage_engine的值設定為InnoDB;小麗使用客戶端B,他想讓當前客戶端對應的預設儲存引擎為MyISAM,所以他可以把系統變數default_storage_engine的值設定為MyISAM。這樣可以使小劉和小麗的的客戶端擁有不同的預設儲存引擎,使用時互不影響,十分方便。但是這樣各個客戶端都私有一份系統變數會產生這麼兩個問題:

有一些系統變數並不是針對單個客戶端的,比如允許同時連線到伺服器的客戶端數量max_connections,查詢快取的大小query_cache_size,這些公有的系統變數讓某個客戶端私有顯然不合適。

一個新連線到伺服器的客戶端對應的系統變數的值該怎麼設定?

為了解決這兩個問題,設計MySQL的大叔提出了系統變數的作用域的概念:

相知MySQL(二):系統變數

作用域

格式:1、SET [GLOBAL|SESSION] 系統變數名 = 值;2、SET [@@(GLOBAL|SESSION)。]var_name = XXX;

global

如果我們想在伺服器執行過程中把作用域為GLOBAL的系統變數default_storage_engine的值修改為InnoDB,也就是想讓之後新連線到伺服器的客戶端都用InnoDB作為預設的儲存引擎,那我們可以選擇下邊兩條語句中的任意一條來進行設定:

例如:1、SET GLOBAL default_storage_engine = InnoDB;2、SET @@GLOBAL。default_storage_engine = InnoDB;

session

如果只想對本客戶端生效,也可以選擇下邊三條語句中的任意一條來進行設定:

例如:1、SET SESSION default_storage_engine = InnoDB;2、SET @@SESSION。default_storage_engine = InnoDB;3、SET default_storage_engine = InnoDB;//預設 session

從上邊的語句三也可以看出,如果在設定系統變數的語句中省略了作用範圍,預設的作用範圍就是SESSION。也就是說SET 系統變數名 = 值和SET SESSION 系統變數名 = 值是等價的。

檢視不同作用範圍的系統變數

既然系統變數有作用範圍之分,那我們的SHOW VARIABLES語句檢視的是什麼作用範圍的系統變數呢?

答:預設檢視的是SESSION作用範圍的系統變數。

當然我們也可以在檢視系統變數的語句上加上要檢視哪個作用範圍的系統變數,就像這樣:

SET [GLOBAL|SESSION] 系統變數名 = 值;

小貼士: 如果某個客戶端改變了某個系統變數在`GLOBAL`作用範圍的值,並不會影響該系統變數在當前已經連線的客戶端作用範圍為`SESSION`的值,只會影響後續連入的客戶端在作用範圍為`SESSION`的值。

注意事項

並不是所有系統變數都具有GLOBAL和SESSION的作用範圍。

有一些系統變數只具有GLOBAL作用範圍,比方說max_connections,表示伺服器程式支援同時最多有多少個客戶端程式進行連線。

有一些系統變數只具有SESSION作用範圍,比如insert_id,表示在對某個包含AUTO_INCREMENT列的表進行插入時,該列初始的值。

有一些系統變數的值既具有GLOBAL作用範圍,也具有SESSION作用範圍,比如我們前邊用到的default_storage_engine,而且其實大部分的系統變數都是這樣的,

有些系統變數是隻讀的,並不能設定值。比方說version,表示當前MySQL的版本,我們客戶端是不能設定它的值的,只能在SHOW VARIABLES語句裡檢視。

啟動選項和系統變數的區別

啟動選項是在程式啟動時我們程式設計師傳遞的一些引數,而系統變數是影響伺服器程式執行行為的變數,它們之間的關係如下:

大部分的系統變數都可以被當作啟動選項傳入。

有些系統變數是在程式執行過程中自動生成的,是不可以當作啟動選項來設定,比如auto_increment_offset、character_set_client啥的。

有些啟動選項也不是系統變數,比如defaults-file。

狀態變數

為了讓我們更好的瞭解伺服器程式的執行情況,MySQL伺服器程式中維護了好多關於程式執行狀態的變數,它們被稱為狀態變數。比方說Threads_connected表示當前有多少客戶端與伺服器建立了連線,Handler_update表示已經更新了多少行記錄,像這樣顯示伺服器程式狀態資訊的狀態變數還有好幾百個,平時用到的可以多去了解哦。

由於狀態變數是用來顯示伺服器程式執行狀況的,所以它們的值只能由伺服器程式自己來設定,我們程式設計師是不能設定的。與系統變數類似,狀態變數也有GLOBAL和SESSION兩個作用範圍的,所以檢視狀態變數的語句可以這麼寫:

SHOW [GLOBAL|SESSION] STATUS [LIKE 匹配的模式];

類似的,如果我們不寫明作用範圍,預設的作用範圍是SESSION,比方說這樣:

mysql> SHOW STATUS LIKE ‘thread%’;

相知MySQL(二):系統變數

所有以Thread開頭的SESSION作用範圍的狀態變數就都被展示出來了。

總結

今天主要學習了MySQL中的系統變數,很多時候,這些變數配置好了,對於我們使用和分析問題都是很有幫助的,所以用好系統變數很重要。希望對大家有所幫助~

歡迎關注留言,一起學習進步呀~