MySQL里的變量分系統(tǒng)變量和用戶變量
mysql里的變量分系統(tǒng)變量和用戶變量.
系統(tǒng)變量
其中系統(tǒng)變量,又分全局(global)和會話(session)兩種.
全局系統(tǒng)變量,主要影響整個mysql實例的全局設(shè)置.
大部分變量都是作為mysql的服務(wù)器調(diào)節(jié)參數(shù)存在.新增或修改這類變量, 會影響mysql的運行方式.
比如: auto_increment_increment 代表序列的自增值, 默認為1
另外, mysql中,只有一部分變量是支持運行時動態(tài)修改的.
變量修改的作用范圍,是那些重新創(chuàng)建連接到mysql服務(wù)器的客戶端連接.
如果你的連接是由應(yīng)用通過連接池來維護的,并且,是長連接的,那么,此時在服務(wù)器運行過程中,動態(tài)地修改全局變量對你是沒有什么影響的.
通過全局變量, 我們可以想到一些應(yīng)用場景:
1, 在存儲過程, 函數(shù), sql里,使用一些業(yè)務(wù)相關(guān)的全局變量.
經(jīng)常編寫業(yè)務(wù)相關(guān)的存儲過程,函數(shù)的朋友, 可能會需要針對不同業(yè)務(wù),設(shè)置能共享訪問的全局變量.
比如, 公司的總?cè)藬?shù),很多存儲過程都需要調(diào)用這個值,但是因為這個值,不是經(jīng)常會改變的,不需要每次都count.
所以大多數(shù)人會考慮把它cache一把,那么mysql提供的全局變量,就是一個好的存儲場所.
2, 數(shù)據(jù)庫配置中心
首先,這不一定是一種好的解決方式, 特別是大型地分布式系統(tǒng).但是想到了,就跟大家分享一下.
主要就是利用了三層,四層架構(gòu)的系統(tǒng), 必不可少的數(shù)據(jù)庫層來實現(xiàn)的.
大家知道, 應(yīng)用的配置, 大多數(shù)是用配置文件或配置服務(wù)器來實現(xiàn), 前者需要跟著項目打包, 部署.
后者, 只要在應(yīng)用初始化或運行時,去配置中心取配置就行了.(淘寶這邊兩者都在用)
而數(shù)據(jù)庫的配置中心, 其實類似配置服務(wù)器, 只不過靈活運用了mysql的變量機制.
它能繼承配置服務(wù)器的多數(shù)優(yōu)點, 但最大的特色就是在 sql, function , procedure 里都可以很方便地引用到.(相比用表的方式, 要方便一些)
并且本身就具有緩存, 移植得話, mysql得導(dǎo)出也是很快.
所以小系統(tǒng), 想快速得搭建一個配置中心,利用mysql感覺還是不錯的.
調(diào)用語法:
select * from user_info where id = @@global.admin_id — 例子,通過全局里配置的管理員id來取用戶信息
以下是全局變量的一些常用命令,比較簡單:
set global auto_increment_increment=1; — 設(shè)置序列的增長值
show global variables; — 顯示所有的global變量
show global variables like ‘%test%’ — 查詢包含test字符串的global變量
會話系統(tǒng)變量, 主要用于在當(dāng)前客戶端連接的生命周期內(nèi).它的變量值是全局變量的一份拷貝.
如果連接斷開, 對當(dāng)前會話變量所做修改都會被重置.
比如, 服務(wù)器會話變量 autocommit 默認為 true , 而你在非常連的客戶端連接里設(shè)置了 false , 那么在執(zhí)行完sql后, 連接就會斷開. 此后,如果創(chuàng)建新的連接來執(zhí)行sql, autocommit又會默認 true.
會話變量的使用場景與全局類似,只是生命周期不同, 因此可以用來
統(tǒng)計同一連接內(nèi)請求sql次數(shù), sql類型等信息.
session變量的一些常用操作:
set session auto_increment_increment=1; — 設(shè)置序列的增長值
show variables; or show session variables; — 如果不指明, 默認使用session變量
show variables like ‘%test%’ or show session variables lile ‘%test%’ — 查詢包含test字符串的session變量
用戶變量
基于會話變量實現(xiàn)的, 可以暫存值, 并傳遞給同一連接里的下一條sql使用的變量.
當(dāng)客戶端連接退出時,變量會被釋放.
應(yīng)用場景:
同一連接,未關(guān)閉情況下,幫你暫存一些計算結(jié)果.
比如
select @admin_id:=max(id) from user_info;
select * from user_info where id = @admin_id
以上兩條sql在同一connection中完成.
另外,注意,用戶變量前只有1個@, 2個@是用于存取系統(tǒng)變量的
業(yè)務(wù)相關(guān)的變量定義太多,無法區(qū)分系統(tǒng)全局變量?
這類問題,可以通過mysql提供的結(jié)構(gòu)化系統(tǒng)變量來解決.
他們有獨特的表示形式:
instance_name.test_var
比一般的變量多了一個instance_name.這樣,你就可以很方便地對他們進行分類,比如 app.test_var,就可以區(qū)別于系統(tǒng)的var了.
PS: 其實,普通的系統(tǒng)變量,它也屬于結(jié)構(gòu)化變量,只不過他們默認隸屬于 default 這個 instance, 不需要顯示出來罷了.
影響mysql性能的系統(tǒng)變量
bulk_insert_buffer_size
批量插入緩存大小, 這個參數(shù)是針對MyISAM存儲引擎來說的.適用于在一次性插入100-1000+條記錄時, 提高效率.默認值是8M.可以針對數(shù)據(jù)量的大小,翻倍增加.
concurrent_insert
并發(fā)插入, 當(dāng)表沒有空洞(刪除過記錄), 在某進程獲取讀鎖的情況下,其他進程可以在表尾部進行插入.
值可以設(shè)0不允許并發(fā)插入,1當(dāng)表沒有空洞時,執(zhí)行并發(fā)插入,2.不管是否有空洞都執(zhí)行并發(fā)插入.
默認是1.針對表的刪除頻率來設(shè)置.
delay_key_write
針對MyISAM存儲引擎,延遲更新索引.意思是說,update記錄時,先將數(shù)據(jù)up到磁盤,但不up索引,將索引存在內(nèi)存里,當(dāng)表關(guān)閉時,將內(nèi)存索引,寫到磁盤. 值為 0不開啟, 1開啟. 默認開啟.
delayed_insert_limit, delayed_insert_timeout, delayed_queue_size
延遲插入, 將數(shù)據(jù)先交給內(nèi)存隊列, 然后慢慢地插入.但是這些配置,不是所有的存儲引擎都支持, 目前來看, 常用的InnoDB不支持, MyISAM支持. 根據(jù)實際情況調(diào)大, 一般默認夠用了.
expire_logs_days
自動刪除超過指定天數(shù)的日志. 建議為0,表示“不自動刪除”.
flush, flush_time
是否啟用, 同步表數(shù)據(jù)到磁盤.以及自動同步的間隔時間.
針對flush_time, 官方建議只在Windows 9x或Me,或有最小資源的系統(tǒng)中使用該選項.所以,建議關(guān)閉.
ft_boolean_syntax, ft_max_word_len, ft_min_word_len,ft_query_expansion_limit, ft_stopword_file
針對MyISAM設(shè)置的參數(shù), 全文搜索特性. 如果你不使用 FULLTEXT 索引,就不需要優(yōu)化了. 詳見mysql參考手冊.
join_buffer_size
用于表間關(guān)聯(lián)(join)的緩存大小.建議設(shè)為 131072.(128K)
key_buffer_size
索引塊緩存區(qū)大小, 針對MyISAM存儲引擎,該值越大,性能越好.但是超過操作系統(tǒng)能承受的最大值,反而會使mysql變得不穩(wěn)定.
如果不是MyISAM存儲引擎,一般設(shè)置為 4-32M大小.
key_cache_age_threshold, key_cache_block_size, key_cache_pision_limit
鍵值緩存的相關(guān)設(shè)置.需要針對實際情況調(diào)優(yōu).只是針對MyISAM儲存引擎.
large_pages
是否啟動大頁面支持.意思是,可以一些緩存分配更大的空間.這個特性已經(jīng)被InnoDB, MyISAM等常用存儲引擎支持.
low_priority_updates
低優(yōu)先級更新.意思是, 所有的寫操作(表寫鎖), 包括update,delete,insert等都需要等待讀操作完成后才執(zhí)行 (表讀鎖解開).
因為是針對表的鎖,所以,這里僅支持MyISAM.
max_write_lock_count
最大寫鎖數(shù)量.這個變量的含義是, 當(dāng)寫鎖達到一定數(shù)量后, 就不限制讀鎖, 允許一部分讀鎖進入.(可以讀數(shù)據(jù)了,否則需要等待寫鎖釋放后,才能讀)
因為是針對表的鎖,所以,這里僅支持MyISAM.
preload_buffer_size
重載索引時分配的緩沖區(qū)大小, 該變量僅支持MyISAM.
read_buffer_size, read_rnd_buffer_size
每個線程連續(xù)掃描時為掃描的每個表分配的緩沖區(qū)的大小(字節(jié))。如果進行多次連續(xù)掃描,可能需要增加該值, 默認值為131072。
sort_buffer_size
每個排序線程分配的緩沖區(qū)的大小。增加該值可以加快ORDER BY或GROUP BY操作.默認數(shù)值是2097144(2M),建議加大到 16777208 (16M)。
timed_mutexes
顯示mutexes的統(tǒng)計信息, 默認關(guān)閉OFF
tmp_table_size
臨時表的大小,在未超過大小之前進行的操作是在內(nèi)存中的, 當(dāng)超過后,mysql會自動轉(zhuǎn)換到硬盤上.
bitsCN.com聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com