MySQL裡的變數分系統變數和使用者變數

2021-12-30 00:50:45 字數 4566 閱讀 4118

mysql裡的變數分系統變數和使用者變數

mysql裡的變數分系統變數和使用者變數.

系統變數

其中系統變數,又分全域性(global)和會話(session)兩種.

全域性系統變數,主要影響整個mysql例項的全域性設定.

大部分變數都是作為mysql的伺服器調節引數存在.新增或修改這類變數, 會影響mysql的執行方式.

比如: auto_increment_increment 代表序列的自增值, 預設為1

另外, mysql中,只有一部分變數是支援執行時動態修改的.

變數修改的作用範圍,是那些重新建立連線到mysql伺服器的客戶端連線.

如果你的連線是由應用通過連線池來維護的,並且,是長連線的,那麼,此時在伺服器執行過程中,動態地修改全域性變數對你是沒有什麼影響的.

通過全域性變數, 我們可以想到一些應用場景:

1, 在儲存過程, 函式, sql裡,使用一些業務相關的全域性變數.

經常編寫業務相關的儲存過程,函式的朋友, 可能會需要針對不同業務,設定能共享訪問的全域性變數.

比如, 公司的總人數,很多儲存過程都需要呼叫這個值,但是因為這個值,不是經常會改變的,不需要每次都count.

所以大多數人會考慮把它cache一把,那麼mysql提供的全域性變數,就是乙個好的儲存場所.

2, 資料庫配置中心

首先,這不一定是一種好的解決方式, 特別是大型地分布式系統.但是想到了,就跟大家分享一下.

主要就是利用了三層,四層架構的系統, 必不可少的資料庫層來實現的.

大家知道, 應用的配置, 大多數是用配置檔案或配置伺服器來實現, 前者需要跟著專案打包, 部署.

後者, 只要在應用初始化或執行時,去配置中心取配置就行了.(**這邊兩者都在用)

而資料庫的配置中心, 其實類似配置伺服器, 只不過靈活運用了mysql的變數機制.

它能繼承配置伺服器的多數優點, 但最大的特色就是在 sql, function , procedure 裡都可以很方便地引用到.(相比用表的方式, 要方便一些)

並且本身就具有快取, 移植得話, mysql得匯出也是很快.

所以小系統, 想快速得搭建乙個配置中心,利用mysql感覺還是不錯的.

呼叫語法:

select * from user_info where id = @@global.admin_id — 例子,通過全域性裡配置的管理員id來取使用者資訊

以下是全域性變數的一些常用命令,比較簡單:

set global auto_increment_increment=1; — 設定序列的增長值

show global variables; — 顯示所有的global變數

show global variables like 『%test%』 — 查詢包含test字串的global變數

會話系統變數, 主要用於在當前客戶端連線的生命週期內.它的變數值是全域性變數的乙份拷貝.

如果連線斷開, 對當前會話變數所做修改都會被重置.

比如, 伺服器會話變數 autocommit 預設為 true , 而你在非常連的客戶端連線裡設定了 false , 那麼在執行完sql後, 連線就會斷開. 此後,如果建立新的連線來執行sql, autocommit又會預設 true.

會話變數的使用場景與全域性類似,只是生命週期不同, 因此可以用來

統計同一連線內請求sql次數, sql型別等資訊.

session變數的一些常用操作:

set session auto_increment_increment=1; — 設定序列的增長值

show variables; or show session variables; — 如果不指明, 預設使用session變數

show variables like 『%test%』 or show session variables lile 『%test%』 — 查詢包含test字串的session變數

使用者變數

基於會話變數實現的, 可以暫存值, 並傳遞給同一連線裡的下一條sql使用的變數.

當客戶端連線退出時,變數會被釋放.

應用場景:

同一連線,未關閉情況下,幫你暫存一些計算結果.

比如select @admin_id:=max(id) from user_info;

select * from user_info where id = @admin_id

以上兩條sql在同一connection中完成.

另外,注意,使用者變數前只有1個@, 2個@是用於訪問系統變數的

業務相關的變數定義太多,無法區分系統全域性變數?

這類問題,可以通過mysql提供的結構化系統變數來解決.

他們有獨特的表示形式:

instance_name.test_var

比一般的變數多了乙個instance_name.這樣,你就可以很方便地對他們進行分類,比如 app.test_var,就可以區別於系統的var了.

ps: 其實,普通的系統變數,它也屬於結構化變數,只不過他們預設隸屬於 default 這個 instance, 不需要顯示出來罷了.

影響mysql效能的系統變數

bulk_insert_buffer_size

批量插入快取大小, 這個引數是針對myisam儲存引擎來說的.適用於在一次性插入100-1000+條記錄時, 提高效率.預設值是8m.可以針對資料量的大小,翻倍增加.

concurrent_insert

併發插入, 當表沒有空洞(刪除過記錄), 在某程序獲取讀鎖的情況下,其他程序可以在表尾部進行插入.

值可以設0不允許併發插入,1當表沒有空洞時,執行併發插入,2.不管是否有空洞都執行併發插入.

預設是1.針對表的刪除頻率來設定.

delay_key_write

針對myisam儲存引擎,延遲更新索引.意思是說,update記錄時,先將資料up到磁碟,但不up索引,將索引存在記憶體裡,當表關閉時,將記憶體索引,寫到磁碟. 值為 0不開啟, 1開啟. 預設開啟.

delayed_insert_limit, delayed_insert_timeout, delayed_queue_size

延遲插入, 將資料先交給記憶體佇列, 然後慢慢地插入.但是這些配置,不是所有的儲存引擎都支援, 目前來看, 常用的innodb不支援, myisam支援. 根據實際情況調大, 一般預設夠用了.

expire_logs_days

自動刪除超過指定天數的日誌. 建議為0,表示「不自動刪除」.

flush, flush_time

是否啟用, 同步表資料到磁碟.以及自動同步的間隔時間.

針對flush_time, 官方建議只在windows 9x或me,或有最小資源的系統中使用該選項.所以,建議關閉.

ft_boolean_syntax, ft_max_word_len, ft_min_word_len,ft_query_expansion_limit, ft_stopword_file

針對myisam設定的引數, 全文搜尋特性. 如果你不使用 fulltext 索引,就不需要優化了. 詳見mysql參考手冊.

join_buffer_size

用於表間關聯(join)的快取大小.建議設為 131072.(128k)

key_buffer_size

索引塊快取區大小, 針對myisam儲存引擎,該值越大,效能越好.但是超過作業系統能承受的最大值,反而會使mysql變得不穩定.

如果不是myisam儲存引擎,一般設定為 4-32m大小.

key_cache_age_threshold, key_cache_block_size, key_cache_division_limit

鍵值快取的相關設定.需要針對實際情況調優.只是針對myisam儲存引擎.

large_pages

是否啟動大頁面支援.意思是,可以一些快取分配更大的空間.這個特性已經被innodb, myisam等常用儲存引擎支援.

low_priority_updates

低優先順序更新.意思是, 所有的寫操作(表寫鎖), 包括update,delete,insert等都需要等待讀操作完成後才執行 (表讀鎖解開).

因為是針對表的鎖,所以,這裡僅支援myisam.

max_write_lock_count

最大寫鎖數量.這個變數的含義是, 當寫鎖達到一定數量後, 就不限制讀鎖, 允許一部分讀鎖進入.(可以讀資料了,否則需要等待寫鎖釋放後,才能讀)

因為是針對表的鎖,所以,這裡僅支援myisam.

preload_buffer_size

過載索引時分配的緩衝區大小, 該變數僅支援myisam.

read_buffer_size, read_rnd_buffer_size

每個執行緒連續掃瞄時為掃瞄的每個表分配的緩衝區的大小(位元組)。如果進行多次連續掃瞄,可能需要增加該值, 預設值為131072。

sort_buffer_size

每個排序執行緒分配的緩衝區的大小。增加該值可以加快order by或group by操作.預設數值是2097144(2m),建議加大到 16777208 (16m)。

timed_mutexes

顯示mutexes的統計資訊, 預設關閉off

tmp_table_size

臨時表的大小,在未超過大小之前進行的操作是在記憶體中的, 當超過後,mysql會自動轉換到硬碟上.

MySQL系統變數

set global session 系統變數名 值 set global default storage engine myisam set session default storage engine myisam 如果在設定系統變數的時候省略了作用範圍,預設的作用範圍就是session sho...

mysql 系變數統 MySQL系統變數

在資料庫中,變數分為系統變數 以 開頭 以及使用者自定義變數。系統變數分為全域性系統變數以及會話系統變數,靜態變數屬於特殊的全域性系統變數。全域性系統變數 global 和會話系統變數 session 有時也把全域性系統變數稱為全域性變數,把會話系統變稱為local變數或者系統會話變數。mysql服...

Linux Shell變數和系統變數

bin bash a 123 引用普通變數 echo a 使用者根目錄 echo home 當前所在目錄 echo pwd 預設使用的shell echo shell 當前使用者 echo user 傳入引數的個數 echo 所有的引數 看做乙個整體 echo 所有的引數 分別看待 echo 系統預...