這篇文章主要介紹了MYSQL中my.cnf參數(shù)的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
mysql常用配置文件參數(shù)介紹和使用方法:
● max_conecctions:整個(gè) MySQL 允許的大連接數(shù);
這個(gè)參數(shù)主要影響的是整個(gè) MySQL 應(yīng)用的并發(fā)處理能力,當(dāng)系統(tǒng)中實(shí)際需要的連接量大于max_conecctions 的情況下,由于 MySQL 的設(shè)置限制,那么應(yīng)用中必然會(huì)產(chǎn)生連接請(qǐng)求的等待,從而限制了相應(yīng)的并發(fā)量。所以一般來(lái)說(shuō),只要 MySQL 主機(jī)性能允許,都是將該參數(shù)設(shè)置的盡可能大一點(diǎn)。一般來(lái)說(shuō) 500 到 800 左右是一個(gè)比較合適的參考值
● max_user_connections:每個(gè)用戶(hù)允許的大連接數(shù);上面的參數(shù)是限制了整個(gè) MySQL 的連接數(shù),而 max_user_connections 則是針對(duì)于單個(gè)用戶(hù)的連接限制。在一般情況下我們可能都較少使用這個(gè)限制,只有在一些專(zhuān)門(mén)提供 MySQL 數(shù)據(jù)存儲(chǔ)服務(wù),或者是提供虛擬主機(jī)服務(wù)的應(yīng)用中可能需要用到。除了限制的對(duì)象區(qū)別之外,其他方面和max_connections 一樣。這個(gè)參數(shù)的設(shè)置完全依賴(lài)于應(yīng)用程序的連接用戶(hù)數(shù),對(duì)于普通的應(yīng)用來(lái)說(shuō),完全沒(méi)有做太多的限制,可以盡量放開(kāi)一些。
● net_buffer_length:網(wǎng)絡(luò)包傳輸中,傳輸消息之前的 net buffer 初始化大小;這個(gè)參數(shù)主要可能影響的是網(wǎng)絡(luò)傳輸?shù)男剩捎谠搮?shù)所設(shè)置的只是消息緩沖區(qū)的初始化大小,所以造成的影響主要是當(dāng)我們的每次消息都很大的時(shí)候 MySQL 總是需要多次申請(qǐng)擴(kuò)展該緩沖區(qū)大小。系統(tǒng)默認(rèn)大小為 16KB,一般來(lái)說(shuō)可以滿(mǎn)足大多數(shù)場(chǎng)景,當(dāng)然如果我們的查詢(xún)都是非常小,每次網(wǎng)絡(luò)傳輸量都很少,而且系統(tǒng)內(nèi)存又比較緊缺的情況下,也可以適當(dāng)將該值降低到8KB。
● max_allowed_packet:在網(wǎng)絡(luò)傳輸中,一次傳消息輸量的大值;這個(gè)參數(shù)與 net_buffer_length 相對(duì)應(yīng),只不過(guò)是 net buffer 的大值。當(dāng)我們的消息傳輸量大于 net_buffer_length 的設(shè)置時(shí),MySQL 會(huì)自動(dòng)增大 net buffer 的大小,直到緩沖區(qū)大小達(dá)到 max_allowed_packet 所設(shè)置的值。系統(tǒng)默認(rèn)值為 1MB,大值是 1GB,必須設(shè)定為 1024 的倍數(shù),單位為字節(jié)。
● back_log:在 MySQL 的連接請(qǐng)求等待隊(duì)列中允許存放的大連接請(qǐng)求數(shù)。連接請(qǐng)求等待隊(duì)列,實(shí)際上是指當(dāng)某一時(shí)刻客戶(hù)端的連接請(qǐng)求數(shù)量過(guò)大的時(shí)候,MySQL 主線(xiàn)程沒(méi)辦法及時(shí)給每一個(gè)新的連接請(qǐng)求分配(或者創(chuàng)建)連接線(xiàn)程的時(shí)候,還沒(méi)有分配到連接線(xiàn)程的所有請(qǐng)求將存放在一個(gè)等待隊(duì)列中,這個(gè)隊(duì)列就是 MySQL 的連接請(qǐng)求隊(duì)列。當(dāng)我們的系統(tǒng)存在瞬時(shí)的大量連接請(qǐng)求的時(shí)候,則應(yīng)該注意 back_log 參數(shù)的設(shè)置。系統(tǒng)默認(rèn)值為 50,大可以設(shè)置為 65535。當(dāng)我們?cè)龃?back_log 的設(shè)置的時(shí)候,同時(shí)還需要主義 OS 級(jí)別對(duì)網(wǎng)絡(luò)監(jiān)聽(tīng)隊(duì)列的限制,因?yàn)槿绻?OS 的網(wǎng)絡(luò)監(jiān)聽(tīng)設(shè)置小于 MySQL 的 back_log 設(shè)置的時(shí)候,我們加大“back_log”設(shè)置是沒(méi)有意義的。
在 MySQL 中,為了盡可提高客戶(hù)端請(qǐng)求創(chuàng)建連接這個(gè)過(guò)程的性能,實(shí)現(xiàn)了一個(gè) Thread Cache 池,將空閑的連接線(xiàn)程存放在其中,而不是完成請(qǐng)求后就銷(xiāo)毀。這樣,當(dāng)有新的連接請(qǐng)求的時(shí)候,MySQL 首先會(huì)檢查 Thread Cache 池中是否存在空閑連接線(xiàn)程,如果存在則取出來(lái)直接使用,如果沒(méi)有空閑連接線(xiàn)程,才創(chuàng)建新的連接線(xiàn)程。在 MySQL 中與連接線(xiàn)程相關(guān)的系統(tǒng)參數(shù)及狀態(tài)變量說(shuō)明如下:
● thread_cache_size:Thread Cache 池中應(yīng)該存放的連接線(xiàn)程數(shù)。
當(dāng)系統(tǒng)最初啟動(dòng)的時(shí)候,并不會(huì)馬上就創(chuàng)建 thread_cache_size 所設(shè)置數(shù)目的連接線(xiàn)程存放在Thread Cache 池中,而是隨著連接線(xiàn)程的創(chuàng)建及使用,慢慢的將用完的連接線(xiàn)程存入其中。當(dāng)存放的連接線(xiàn)程達(dá)到 thread_cache_size 值之后,MySQL 就不會(huì)再續(xù)保存用完的連接線(xiàn)程了。如果我們的應(yīng)用程序使用的短連接,Thread Cache 池的功效是最明顯的。因?yàn)樵诙踢B接的數(shù)據(jù)庫(kù)應(yīng)用中,數(shù)據(jù)庫(kù)連接的創(chuàng)建和銷(xiāo)毀是非常頻繁的,如果每次都需要讓 MySQL 新建和銷(xiāo)毀相應(yīng)的連接線(xiàn)程,那么這個(gè)資源消耗實(shí)際上是非常大的,而當(dāng)我們使用了 Thread Cache 之后,由于連接線(xiàn)程大部分都是在創(chuàng)建好了等待取用的狀態(tài),既不需要每次都重新創(chuàng)建,又不需要在使用完 之 后 銷(xiāo) 毀 , 所 以 可 以 節(jié) 省 下 大 量 的 系 統(tǒng) 資 源 。 所 以 在 短 連 接 的 應(yīng) 用 系 統(tǒng) 中 ,thread_cache_size 的值應(yīng)該設(shè)置的相對(duì)大一些,不應(yīng)該小于應(yīng)用系統(tǒng)對(duì)數(shù)據(jù)庫(kù)的實(shí)際并發(fā)請(qǐng)求數(shù)。而如果我們使用的是長(zhǎng)連接的時(shí)候,Thread Cache 的功效可能并沒(méi)有使用短連接那樣的大,但
也并不是完全沒(méi)有價(jià)值。因?yàn)閼?yīng)用程序即使是使用了長(zhǎng)連接,也很難保證他們所管理的所有連接都能處于很穩(wěn)定的狀態(tài),仍然會(huì)有不少連接關(guān)閉和新建的操作出現(xiàn)。在有些并發(fā)量較高,應(yīng)
用服務(wù)器數(shù)量較大的系統(tǒng)中,每分鐘十來(lái)次的連接創(chuàng)建與關(guān)閉的操作是很常見(jiàn)的。而且如果應(yīng)用服務(wù)器的連接池管理不是太好,容易產(chǎn)生連接池抖動(dòng)的話(huà),所產(chǎn)生的連接創(chuàng)建和銷(xiāo)毀操作將
會(huì)更多。所以即使是在使用長(zhǎng)連接的應(yīng)用環(huán)境中,Thread Cache 機(jī)制的利用仍然是對(duì)性能大有幫助的。只不過(guò)在長(zhǎng)連接的環(huán)境中我們不需要將 thread_cache_size 參數(shù)設(shè)置太大,一般來(lái)說(shuō)
可能 50 到 100 之間應(yīng)該就可以了。
● thread_stack:每個(gè)連接線(xiàn)程被創(chuàng)建的時(shí)候,MySQL 給他分配的內(nèi)存大小。
當(dāng) MySQL 創(chuàng)建一個(gè)新的連接線(xiàn)程的時(shí)候,是需要給他分配一定大小的內(nèi)存堆??臻g,以便存放客戶(hù)端的請(qǐng)求 Query 以及自身的各種狀態(tài)和處理信息。不過(guò)一般來(lái)說(shuō)如果不是對(duì) MySQL 的連接線(xiàn)
程處理機(jī)制十分熟悉的話(huà),不應(yīng)該輕易調(diào)整該參數(shù)的大小,使用系統(tǒng)的默認(rèn)值(192KB)基本上可以所有的普通應(yīng)用環(huán)境。如果該值設(shè)置太小,會(huì)影響 MySQL 連接線(xiàn)程能夠處理客戶(hù)端請(qǐng)求的Query 內(nèi)容的大小,以及用戶(hù)創(chuàng)建的 Procedures 和 Functions 等
計(jì)算出系統(tǒng)新建連接連接的 Thread
Cache 命中率,也就是通過(guò) Thread Cache 池中取得連接線(xiàn)程的次數(shù)與系統(tǒng)接收的總連接次數(shù)的比率,如下:
Threads_Cache_Hit = (Connections - Threads_created) / Connections * 100%我們可以通過(guò)上面的這個(gè)運(yùn)算公式計(jì)算一下上面環(huán)境中的 Thread Cache 命中率:Thread_Cache_Hit= (127 - 12) / 127 * 100% = 90.55%一般來(lái)說(shuō),當(dāng)系統(tǒng)穩(wěn)定運(yùn)行一段時(shí)間之后,我們的 Thread Cache 命中率應(yīng)該保持在 90%左右甚至更高的比率才算正常??梢钥闯錾厦姝h(huán)境中的 Thread Cache 命中比率基本還算是正常的。Table Cache 相關(guān)的優(yōu)化,我們先來(lái)看一下 MySQL 打開(kāi)表的相關(guān)機(jī)制。由于多線(xiàn)程的實(shí)現(xiàn)機(jī)制,為了盡可能的提高性能,在MySQL 中每個(gè)線(xiàn)程都是獨(dú)立的打開(kāi)自己需要的表的文件描述符,而不是通過(guò)共享已經(jīng)打開(kāi)的表的文件描述符的機(jī)制來(lái)實(shí)現(xiàn)。當(dāng)然,針對(duì)于不同的存儲(chǔ)引擎可能有不同的處理方式。如 MyISAM 表,每一個(gè)客戶(hù)端線(xiàn)程打開(kāi)任何一個(gè) MyISAM 表的數(shù)據(jù)文件都需要打開(kāi)一個(gè)文件描述符,但如果是索引文件,則可以多個(gè)線(xiàn)程共享同一個(gè)索引文件的描述符。對(duì)于 Innodb 的存儲(chǔ)引擎,如果我們使用的是共享表空間來(lái)存儲(chǔ)數(shù)據(jù),那
么我們需要打開(kāi)的文件描述符就比較少,而如果我們使用的是獨(dú)享表空間方式來(lái)存儲(chǔ)數(shù)據(jù),則同樣,由于存儲(chǔ)表數(shù)據(jù)的數(shù)據(jù)文件較多,則同樣會(huì)打開(kāi)很多的表文件描述符。除了數(shù)據(jù)庫(kù)的實(shí)際表或者索引打開(kāi)以外,臨時(shí)文件同樣也需要使用文件描述符,同樣會(huì)占用系統(tǒng)中 open_files_limit 的設(shè)置限額。為了解決打開(kāi)表文件描述符太過(guò)頻繁的問(wèn)題,MySQL 在系統(tǒng)中實(shí)現(xiàn)了一個(gè) Table Cache 的機(jī)制,和前面介紹的 Thread Cache 機(jī)制有點(diǎn)類(lèi)似,主要就是 Cache 打開(kāi)的所有表文件的描述符,當(dāng)有新的請(qǐng)求的時(shí)候不需要再重新打開(kāi),使用結(jié)束的時(shí)候也不用立即關(guān)閉。通過(guò)這樣的方式來(lái)減少因?yàn)轭l繁打開(kāi)關(guān)閉文件描述符所帶來(lái)的資源消耗。我們先看一看 Table Cache 相關(guān)的系統(tǒng)參數(shù)及狀態(tài)變量。在 MySQL 中我們通過(guò) table_cache(從 MySQL5.1.3 開(kāi)始改為table_open_cache),來(lái)設(shè)置系統(tǒng)中為我們 Cache 的打開(kāi)表文件描述符的數(shù)量。通過(guò) MySQL 官方手冊(cè)中的介紹,我們?cè)O(shè)置 table_cache 大小的時(shí)候應(yīng)該通過(guò) max_connections 參數(shù)計(jì)算得來(lái),公式如下:
table_cache = max_connections * N;其中 N 代表單個(gè) Query 語(yǔ)句中所包含的最多 Table 的數(shù)量。但是我個(gè)人理解這樣的計(jì)算其實(shí)并不是太準(zhǔn)確,分析如下:
首先,max_connections 是系統(tǒng)同時(shí)可以接受的大連接數(shù),但是這些連接并不一定都是 active 狀態(tài)的,也就是說(shuō)可能里面有不少連接都是處于 Sleep 狀態(tài)。而處于 Sleep 狀態(tài)的連接是不可能打開(kāi)任何Table 的。其次,這個(gè) N 為執(zhí)行 Query 中包含最多的 Table 的 Query 所包含的 Table 的個(gè)數(shù)也并不是太合適,因?yàn)槲覀儾荒芎雎运饕募拇蜷_(kāi)。雖然索引文件在各個(gè)連接線(xiàn)程之間是可以共享打開(kāi)的連接描述符的,但總還是需要的。而且,如果我 Query 中的每個(gè)表的訪(fǎng)問(wèn)都是通過(guò)現(xiàn)通過(guò)索引定位檢索的,甚至可能還是通過(guò)多個(gè)索引,那么該 Query 的執(zhí)行所需要打開(kāi)的文件描述符就更多了,可能是 N 的兩倍甚至三倍。最后,這個(gè)計(jì)算的公式只能計(jì)算出我們同一時(shí)刻需要打開(kāi)的描述符的大數(shù)量,而 table_cache 的設(shè)置也不一定非得根據(jù)這個(gè)極限值來(lái)設(shè)定,因?yàn)?table_cache 所設(shè)定的只是 Cache 打開(kāi)的描述符的數(shù)量的大小,而不是最多能夠打開(kāi)的量的大小。
join_buffer_size :當(dāng)我們的 Join 是 ALL , index , rang 或者 index_merge 的時(shí)候使用的Buffer;實(shí)際上這種 Join 被稱(chēng)為 Full Join。實(shí)際上參與 Join 的每一個(gè)表都需要一個(gè) Join Buffer,所以在Join 出現(xiàn)的時(shí)候,至少是兩個(gè)。Join Buffer 的設(shè)置在 MySQL 5.1.23 版本之前大為 4GB,但是從5.1.23 版本開(kāi)始,在除了 Windows 之外的 64 位的平臺(tái)上可以超出 4BG 的限制。系統(tǒng)默認(rèn)是 128KB。
● sort_buffer_size:系統(tǒng)中對(duì)數(shù)據(jù)進(jìn)行排序的時(shí)候使用的 Buffer;Sort Buffer 同樣是針對(duì)單個(gè) Thread 的,所以當(dāng)多個(gè) Thread 同時(shí)進(jìn)行排序的時(shí)候,系統(tǒng)中就會(huì)出現(xiàn)多個(gè) Sort Buffer。一般我們可以通過(guò)增大 Sort Buffer 的大小來(lái)提高 ORDER BY 或者是 GROUP BY的處理性能。系統(tǒng)默認(rèn)大小為 2MB,大限制和 Join Buffer 一樣,在 MySQL 5.1.23 版本之前大為 4GB,從 5.1.23 版本開(kāi)始,在除了 Windows 之外的 64 位的平臺(tái)上可以超出 4GB 的限制。如果應(yīng)用系統(tǒng)中很少有 Join 語(yǔ)句出現(xiàn),則可以不用太在乎 join_buffer_size 參數(shù)的大小設(shè)置,但是如果 Join 語(yǔ)句不是很少的話(huà),個(gè)人建議可以適當(dāng)增大 join_buffer_size 的設(shè)置到 1MB 左右,如果內(nèi)存充足甚至可以設(shè)置為 2MB。對(duì)于 sort_buffer_size 參數(shù)來(lái)說(shuō),一般設(shè)置為 2MB 到 4MB 之間可以滿(mǎn)足大多數(shù)
應(yīng)用的需求。當(dāng)然,如果應(yīng)用系統(tǒng)中的排序都比較大,內(nèi)存充足且并發(fā)量不是特別的大的時(shí)候,也可以繼續(xù)增大 sort_buffer_size 的設(shè)置。在這兩個(gè) Buffer 設(shè)置的時(shí)候,最需要注意的就是不要忘記是每個(gè)Thread 都會(huì)創(chuàng)建自己獨(dú)立的 Buffer,而不是整個(gè)系統(tǒng)共享的 Buffer,不要因?yàn)樵O(shè)置過(guò)大而造成系統(tǒng)內(nèi)存不足。
innodb_thread_concurrendy:此參數(shù)為innodb為保障服務(wù)正常運(yùn)行的限流操作,設(shè)置為0表示由innodb自己控制;一般建議設(shè)置為服務(wù)器CPU的核數(shù)(不含超線(xiàn)程),過(guò)大會(huì)導(dǎo)致服務(wù)hang死等不可用情況
innodb_io_capacity:每秒后臺(tái)進(jìn)程處理IO操作的數(shù)據(jù)頁(yè)上線(xiàn),一般可設(shè)置為存儲(chǔ)總IO能力的75%,一般IO性能比較好的情況下此參數(shù)建議配置成1000
innodb_buffer_pool_instance:在innodb_buffer_pool中劃分實(shí)例,每個(gè)實(shí)例下都包含flush、LRU、free列表,一般大內(nèi)存建議配置多個(gè)innodb_buffer_pool_instance
innodb_max_dirty_pages_pct:innodb從innodb_buffer_pool中刷新臟頁(yè)到磁盤(pán)的比例,設(shè)置太高對(duì)IO影響較大,此參數(shù)與innodb_io_capacity結(jié)合使用,IO性能較好情況下可以設(shè)置為75%
innodb_flush_method:設(shè)置為O_DIRECT時(shí),直接刷新內(nèi)存數(shù)據(jù)到磁盤(pán)避免raid設(shè)備上的緩存
innodb_file_per_table:設(shè)置為1,每個(gè)表單獨(dú)一個(gè)數(shù)據(jù)文件,這樣可以放在其他磁盤(pán)做軟連接,提升IO性能;另一方面可以降低共享表空間的IO競(jìng)爭(zhēng),避免ibdata1過(guò)大
innodb_flush_log_at_trx_commit:設(shè)置為0:每秒將log buffur中的內(nèi)容刷新到磁盤(pán);設(shè)置為1:每次事務(wù)提交前將log buffur中內(nèi)容刷新到磁盤(pán);設(shè)置為2:將log buffur中內(nèi)容寫(xiě)入事務(wù)日志,但由于操作系統(tǒng)等緩存可能存在,不一定會(huì)刷新到磁盤(pán)
sync_binlog:刷新binlog的數(shù)目,非核心系統(tǒng)設(shè)置為1000,表示當(dāng)累積1000條binlog記錄時(shí)才會(huì)刷新到磁盤(pán);核心系統(tǒng)可以設(shè)置為1,保證主備服務(wù)器數(shù)據(jù)同步;雙1模式:即innodb_flush_log_at_trx_commit和sync_binlog都設(shè)置為1,這樣主備的數(shù)據(jù)時(shí)一致的,不會(huì)丟失數(shù)據(jù)
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“MYSQL中my.cnf參數(shù)的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
文章題目:MYSQL中my.cnf參數(shù)的示例分析-創(chuàng)新互聯(lián)
當(dāng)前URL:http://chinadenli.net/article42/dcpdec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、App設(shè)計(jì)、靜態(tài)網(wǎng)站、定制網(wǎng)站、定制開(kāi)發(fā)、全網(wǎng)營(yíng)銷(xiāo)推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容