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 系統預...