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