萬(wàn)圣節已經(jīng)過(guò)去很久了,極具參技巧該是調優(yōu)把注意力集中在即將到來(lái)的假日季節的時(shí)候了。首先是極具參技??巧感恩節,接著(zhù)就是調優(yōu)黑色星期五和網(wǎng)絡(luò )星期一,最終在圣誕節/節禮周(從12月26日的極具參技巧節禮日開(kāi)始,到12月31日的調優(yōu)除夕結束為期六天或更長(cháng)??時(shí)間。這個(gè)詞是極具參技巧由??零售業(yè)在2000年代中期左右發(fā)明的,試圖延長(cháng)他???們的調優(yōu)節禮日銷(xiāo)售)達到購物高潮。對于企業(yè)主來(lái)說(shuō),極具參技巧一年的調優(yōu)這個(gè)時(shí)候標志著(zhù)人們期待已久的年底獲利了結。對于一些DBA來(lái)說(shuō),極具參技巧它會(huì )帶來(lái)恐懼,調優(yōu)不安,極具參技巧甚至是調(diao)優(yōu)不眠之夜,他們要努力使系統重新上線(xiàn)。極具參技巧
值得慶幸是,情況并非如此。通過(guò)對MySQL性能( ???)變量做一些主動(dòng)調整,可以使數據庫服務(wù)器免受購物旺季(?⊿?)帶來(lái)的需求增加的沖擊(??ヮ?)?*:???。
技巧#1:確定MySQL的最大連接數
一旦有了對特定使用情況的準確估計,請將該比率乘以Web服務(wù)器(′_`)的最大連接??數。例如,如果Web服務(wù)器配置為最多為256(′?`*)個(gè)客戶(hù)端提供┐(′д`)┌服務(wù),MySQL請求與(yu)Web請求的比率為1/8,則最好將最大數據庫連接數設置為32。還要考慮留有安全余量,把這個(gè)數乘以2,得到最終的數量。只有在基礎設施支持的情況下,才能?chē)L試將數據庫連接數的最大數量與Web??服務(wù)器的客戶(hù)端限制相匹配。在大多數情況下,最好保持接近32??。
在Monyog中查看MySQL連接
還有一個(gè)連接歷史記錄監控,可以幫助計算最佳的最大并發(fā)連接數。它包括嘗試,拒絕和成功連接的數量。此外,允???許達到的最大指標的百分比顯示為一個(gè)進(jìn)度條,可以讓你快速評估服務(wù)器在過(guò)去達到的最大并發(fā)連接數:
技巧#2:為臨時(shí)表分配足夠的內存( ?▽?)
在某些情況下,服務(wù)器在處理語(yǔ)句時(shí)會(huì )創(chuàng )建內部臨時(shí)表。臨時(shí)表用于內部操作如GROUP BY和distinct,還有一些ORDER BY查詢(xún)以及UNION和FROM??子句(派生表)中的子查詢(xún)。這??些都是在內存中創(chuàng )建的內存表。內存中臨時(shí)表的最大大小由 tmp_t┐(′?`)┌able_size和 max_heap_table_size中較小的值確定。如果臨時(shí)表的大小超過(guò)這個(gè)閾值,則將其轉換為磁盤(pán)上的InnoDB或MyISAM表。此外,如果查詢(xún)涉及BLOB或TEXT列,而這些列不能存儲在內存??(cun)表中(???),臨時(shí)表總是直接(???)指向磁盤(pán)。
這種轉換的代價(jià)很大,所以考慮增加 max_heap_table_size和 tmp_table_size變量的大小來(lái)幫助減??少在磁盤(pán)上創(chuàng )建臨時(shí)??表的數量。請記住,這將需要大量?jì)却?,?╯‵□′)╯為內存中臨時(shí)表的大小是基于(yu)“最壞情況”的。例如,內存表總是使用固定長(cháng)度的列,??所以字符列使用VARCHAR(255)。這可以使內存中的臨時(shí)表比想象的要大得多—事實(shí)上,這比查詢(xún)表的總大小要大很多倍!當增加 max_heap_table_size和 tmp_table_sizevariables的大小時(shí),一定要監視服務(wù)器的內存使用情況,因為內存中的臨時(shí)表可能會(huì )增加達到服務(wù)器內存容量的風(fēng)險。
一般來(lái)說(shuō),32M到64M??是建議ˉ\_(ツ)_/ˉ值,從這兩個(gè)變量開(kāi)始并根據需要(′?_?`)進(jìn)行調優(yōu)。
允許的最大值 :顯示 tmp_table_size服務(wù)器變量的值,它定義了在內存中創(chuàng )建的臨時(shí)表的最大大小。與 max_heap_table_size一起,這個(gè)值定義了可以在內存中創(chuàng )建的臨時(shí)表(biao)的最大大小。如??果內存臨時(shí)表大于此大小,則將其存儲在磁盤(pán)上。 內存表的最大大小 :顯示 max_hea??p_table_size服務(wù)器變量的值,該值定義了顯式創(chuàng )建的MEMORY存儲引擎表的最大大小。 創(chuàng )建的臨時(shí)表總ヾ(′▽?zhuān)??數 :顯示 created_tmp_tables服務(wù)器變量的值,它定義了在內存中創(chuàng )建的臨時(shí)表的數量。 在磁盤(pán)上創(chuàng )建的臨時(shí)表 :顯示 created_tmp_disk_tabl(?_?;)es服務(wù)器變量的值,該變量定義了在磁盤(pán)上創(chuàng )建的臨時(shí)表的數量。??如果這個(gè)值很高,則應該考慮(??ヮ?)?*:???增加 tmp_t??able_size和 max_heap_table_(′?ω?`)size的值,以便增加創(chuàng )建內存臨時(shí)表的數量,從而減少在磁盤(pán)上創(chuàng )建臨時(shí)表的數量。 磁盤(pán):總比率 :基于 createdヽ(′?`)ノ_tmp_disk_tables除以 created_tmp_tables的計算值。由于 tmp_table_size或 max_heap_table_size不足而(?_?;)在(zai)磁盤(pán)上創(chuàng )建的臨時(shí)表的百分比。Monyog將這個(gè)數字顯示為一個(gè)進(jìn)度條和百分比,以便快速確定有多少磁盤(pán)用于臨時(shí)表,而不是內存。 趨勢圖可用于創(chuàng )建的總表,磁盤(pán)上創(chuàng )建的表和磁盤(pán)的總??比值。這些讓我們看到了它們隨著(zhù)時(shí)間的演變:
技巧#3:增加線(xiàn)程緩存大小
MySQL提供了許多與連接線(xiàn)程相關(guān)的服務(wù)器變量(liang):
線(xiàn)程緩存大小由 thre┐(′?`)┌ad_cache_size系統變量決定。默認值為0??(無(wú)緩存),這將導致為每個(gè)新連接設置一個(gè)線(xiàn)程,并在連接終止時(shí)需要處理該線(xiàn)程。如果希望服務(wù)器每秒接收數百個(gè)連接請?求,那么應該將 thread_cache_size設置的足夠高??,以便大多數新連接可以使用緩存線(xiàn)(xian)程??梢栽诜d(′?`)?務(wù)器啟動(dòng)或運行時(shí)設置 max_connections的值。
還應該監視緩存中的線(xiàn)程數( Threads_cached)以及創(chuàng )(′_ゝ`)建了多少??個(gè)線(xiàn)程,因為無(wú)法從緩存中獲取線(xiàn)程( Threads_created)。關(guān)于后者,如果 Threads_created繼續以每分鐘多于幾個(gè)線(xiàn)程的增加,請考慮(′;ω;`)增加 thread_cache_size的值。
使用MySQL show status命令顯示MySQL的變量和狀態(tài)信息。這里有幾個(gè)例子:
SHOWヽ(′?`)ノ GLOBAL STATUS LIKE '%Threads_connected%'; +-------------------+-------+ | Variable_name | Value | +-------------ヾ(′?`)?------+-------+ | Threads_co(′?`)nnected | 2 | +-------------------+-ヽ(′ー`)ノ------+ SH(°□°)OW GLOBAL STATUS LIKE(′-ι_-`) '%Threads_running%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Threads_running | 1 | +-----------------+-------+
Monyog線(xiàn)程緩存監測
Monyog提供了一個(gè)監控線(xiàn)程緩存的屏幕,名為“線(xiàn)程”。與MyS(°o°)QL線(xiàn)程相關(guān)的服務(wù)器變量映射到以下Monyog指標:
thread_cache_size:可以緩存(╯°□°)╯的線(xiàn)??程數??。
Threads_cached:緩存中的線(xiàn)程數。??
Threads_created:創(chuàng )建用于處理連接的線(xiàn)程.
Monyog線(xiàn)程屏幕還包括??“線(xiàn)程緩存命中率”指標。這是一個(gè)提示線(xiàn)程緩存命中率的指標。如果值較低,則應該考慮增加線(xiàn)程緩存。在狀態(tài)欄以百分比形式顯示該值;(°o°)它的值越接近100%越好。
如果這些指標的值等于或超過(guò)指定值,則可以將每一個(gè)指標配置為發(fā)出警告和(′?`*)/或嚴重警報。
其他相關(guān)的服務(wù)器變量
除了上述指標以外,還ヽ(′ー`)ノ應該??監控以下內容:
雖然即便是最大的公司網(wǎng)站也會(huì )因宕機而遭受損失,但這(zhe)種影響對于處理網(wǎng)上銷(xiāo)售的中小型企業(yè)尤其關(guān)鍵。根據 最近的一份調查報告 顯示,一分鐘的宕機導致企業(yè)平均損失約5000美元。不要讓你的業(yè)務(wù)成為那種統計數據(因為宕機造成的損失)的一部分。在假日繁忙之前,主動(dòng)調優(yōu)MySQL數據庫┐(′?`)┌服務(wù)器(S)并收獲回報吧!