MySQL變量的概念
個(gè)人認(rèn)為可以理解成MySQL在啟動(dòng)或者運(yùn)行過程中讀取的一些參數(shù)問題,利用這些參數(shù)來啟動(dòng)服務(wù)、響應(yīng)或者支持用戶的請(qǐng)求等
變量的配置
如果打算長(zhǎng)期使用,應(yīng)該寫入配置文件,而不是在命中指定,因?yàn)樵诿性O(shè)置的變量會(huì)隨著MySQL服務(wù)的重啟而恢復(fù)默認(rèn)值
另外要注意是設(shè)置的當(dāng)前Session的變量還是全局的變量。
變量單位
不同的變量的單位不同,比如table_cache是指緩存的表的個(gè)數(shù),而key_buffer_size則是以字節(jié)為單位
另外還有以頁或者百分比為單位的變量
許多變量可以通過后綴制訂單位,
比如1M表示一百萬字節(jié),在配置文件中或者在命令行下有效,
但是在使用set命令的時(shí)候,這些單位就無效,必須使用數(shù)字,單位為字節(jié)
比如:set @@session.sort_buffer_size = 1024*1024或者set @@session.sort_buffer_size = 1048576
但是配置文件中設(shè)置的時(shí)候就不能使用表達(dá)式
變量的作用域
有些變量的作用是服務(wù)器級(jí)別的,有些是Session級(jí)別的,剩下的的一些是對(duì)象級(jí)別的。
許多回話的變量是全局變量相等,可以為是默認(rèn)值
如果改變會(huì)話級(jí)的變量,它只影響當(dāng)前Session,當(dāng)前Session關(guān)閉后當(dāng)前設(shè)置的參數(shù)會(huì)失效
舉例:
query_cache_size是全局級(jí)的
sort_buffer_size可以在全局級(jí)設(shè)置,每個(gè)Session也可以獨(dú)立設(shè)置
join_buffer_size可以在全局級(jí)設(shè)置,也可以在Session級(jí)設(shè)置,一個(gè)查詢中如果有多個(gè)表關(guān)聯(lián),可以為每個(gè)關(guān)聯(lián)分配一個(gè)join buffer
除了在配置文件中設(shè)置變量之外,(部分變量)也可以在運(yùn)行時(shí)修改,MySQL稱之為動(dòng)態(tài)配置變量
比如: set global sort_buffer_size = 1024*1024*1024
set sort_buffer_size = 1024*1024*1024
set @@sort_buffer_size = 1024*1024*1024
set @@session.sort_buffer_size = 1024*1024*1024
set @@global.sort_buffer_size = 1024*1024*1024
常見變量的設(shè)置與獲取資源說明:
key_buffer_size
為鍵緩沖區(qū)(key buffer,也叫鍵緩存key cache)分配所有指定的空間,
操作系統(tǒng)不會(huì)為該設(shè)置立馬分配內(nèi)存,而是等到使用的時(shí)候才分配。
table_cache_size
當(dāng)有線程打開表時(shí),MySQL會(huì)檢查這個(gè)標(biāo)量的值,如果大于緩存中表的數(shù)量,線程可以把最先打開的表放入緩存,
如果該值比緩存中的表數(shù)小,MySQL將從緩存中刪除不常用的表
thread_cache_size
當(dāng)有連接關(guān)閉時(shí),MySQL檢查緩存中是否還有空間來緩存線程。
如果有:則緩存改線程已被下次連接重用
如果沒有:他講銷毀改線程而不再緩存,
緩存中使用的線程數(shù),不會(huì)立即減少,只有在新的連接刪除緩存中的一個(gè)線程并使用后才會(huì)減少
MySQL只在關(guān)閉連接時(shí)候才在緩沖中增減線程,在創(chuàng)建新的連接的時(shí)候才從緩存中刪除線程
query_cache_size
MySQL啟動(dòng)的時(shí)候,一次性分配并且初始化這塊內(nèi)存,如果修改這個(gè)變量(即使設(shè)置為與當(dāng)前值一樣)
MySQL會(huì)立刻刪除所有緩存的查詢,重新分配這片緩存到指定大小,并且重新初始化內(nèi)存
read_buffer_size
MySQL只會(huì)在查詢需要時(shí)才會(huì)為該緩存分配內(nèi)存,并且會(huì)一次性分配改參數(shù)指定大小的全部?jī)?nèi)存
read_rnd_buffer_size
MySQL只會(huì)在查詢需要時(shí)才會(huì)為該緩存分配內(nèi)存,并且只分配需要的內(nèi)存大小而不是全部指定的大小
應(yīng)該叫做,max_read_rnd_buffer_size
sort_buffer_size
MySQL只會(huì)在查詢需要做排序操作的時(shí)候拆毀為該緩存分配內(nèi)存,
一旦需要排序,MySQL就會(huì)立刻分配給改參數(shù)指定大小的全部?jī)?nèi)存,而不管排序是否需要這么大的內(nèi)存。
由此可見,不用的變量,設(shè)置之后的啟用時(shí)間,啟用原理,生效方式等都是有一定差異的。
設(shè)置變量的潛在的影響
動(dòng)態(tài)設(shè)置全局變量可能會(huì)導(dǎo)致意外的副作用。
某些變量改變后會(huì)立即生效,比如從緩沖中刷新贓塊,從而引起服務(wù)器相應(yīng)請(qǐng)求的一些不穩(wěn)定甚至更嚴(yán)重的問題