配置mysql 正確使用的記憶體量對於高效能是至關重要的,需要進行定製需求來定製記憶體的使用。
mysql記憶體消耗可以分為兩類:可控制記憶體和不可控制記憶體。
無法控制
mysql 伺服器執行、查詢解析、以及內部管理所消耗的記憶體,但是為特定目的而使用的記憶體有很多引數可以進行控制,比如關聯使用join buffer、排序使用sort buffer等。
可控制用好mysql可控制的記憶體則需要對配置的含義非常清楚
下面的步驟是來配置記憶體的
1、確定可以使用的記憶體上限
2、確定每個連線mysql 需要多少記憶體,例如排序緩衝和臨時表
3、確認作業系統需要多少記憶體才夠用。包括同一臺機器上其他程式所使用的記憶體,比如定時任務等……
4、把剩下的記憶體交給mysql 快取,例如innodb的緩衝池,這樣做很有意義
每個mysql 連線需要的記憶體
mysql保持乙個連線(執行緒)只需要少量的記憶體,它還要求乙個基本的記憶體來執行任何給定的查詢。需要在高峰期大量的查詢時預留好足夠的記憶體,否則查詢的執行可能會因為缺乏記憶體而執行效率不佳
或者執行失敗。
知道mysql 在高峰期消耗多少記憶體是非常有用的,但是一些習慣的用法可能會導致意外的消耗了大量的記憶體,這對記憶體的使用量的**變得比較困難,例如繫結變數和innodb資料字典。
當**記憶體峰值消耗時,沒必要假設乙個最壞的情況,例如配置mysql 允許最多100個連線,在理論上可能出現100個連線同時在執行很大的查詢,在現實情況下可能不會發生,例如:
設定myisam_sort_buffer_size為256mb,最差的情況下至少需要使用25gb記憶體,但是這種最差的情況實際幾乎是不可能發生的,使用了許多大的臨時表或者複雜儲存過程的查詢,通常是
導致記憶體高消耗的最可能的原因。
相對於最壞情況的開銷,更好的方法是觀察伺服器在真實工作壓力下使用了多少記憶體,可以在程序的虛擬記憶體大小那裡看到,許多類unix系統裡,可以觀察top命令中virt列,或者ps命令中vsz
的值。為作業系統保留記憶體
和查詢一樣,作業系統也需要足夠的記憶體給它工作。如果沒有虛擬記憶體正在交換(paging)到硬碟,就是表明了系統記憶體足夠用的最佳跡象。至少應該為作業系統保留1~2g的記憶體,如果機器記憶體多
就多預留一些,我們建議2gb獲取總記憶體的5%作為基準,以較大者為準,為了安全再額外增加一些預留,並且如果機器還在執行記憶體密集任務(如備份),則可以再多增加一些預留,不要為作業系統快取
增加任何記憶體,因為他們可能變得非常大,作業系統通常會利用所有剩下的記憶體來做檔案系統快取,我們認為,這應該從作業系統自身的需求分離出來。
為快取分配記憶體
如果伺服器只執行mysql,所有不需要為作業系統以及查詢處理保留的記憶體都可以用來做mysql快取。
相比其他,mysql需要為快取分配更多的記憶體,它使用快取來避免磁碟訪問,磁碟訪問比記憶體訪問要慢得多,作業系統可能會快取一些資料,這對mysql有些好處,但是mysql自身也需要大量的記憶體。
下面是我們認為大部分情況最重要的快取
innodb 快取池
innodb 日誌檔案和myisam 資料的作業系統快取
myisam 鍵快取
查詢快取
無法手工配置的快取,例如二進位制日誌和表定義檔案的作業系統快取
還有其他快取通常不會使用太多記憶體
如果使用單一的儲存引擎,配置伺服器就簡單許多了。如果只使用myisam 就可以完全關閉innodb,如果只使用innodb,就只需要分配最少的資源給myisam(mysql 內部系統錶用myisam),但是
如果正混用各種儲存引擎,就很難在他們之間找到恰當的平衡,我們發現最好的辦法是做乙個有根據的猜測,然後在執行中觀察伺服器(再進行調整)
innodb緩衝池
如果大部分都是innodb表,那麼innodb快取池或許比任何東西都需要記憶體,innodb快取池並不僅僅是快取索引,它還會快取行的資料,自適應hash索引,插入緩衝(insert buffer)、鎖以及其他內部的
資料結構。innodb還是用緩衝池來幫助延遲寫入,這樣就能合併多個寫入操作,然後順序一起寫回。總之innodb嚴重依賴緩衝池,你必須確認為他分配了足夠的記憶體,可以使用show 命令得到變數,或
使用例如innotop的工具監控innodb的緩衝池記憶體利用的情況。
如果資料量不大,並且不會快速的增長,就沒必要為緩衝池分配過多的記憶體,把緩衝池配置的比需要快取的表和索引還要大很多實際沒有什麼意義,當然,對於乙個快速增長的資料庫做超前的規劃沒有
錯,但有時候我們也會看到乙個巨大的緩衝池之快取了一點資料,就沒必要了。
很大的緩衝池也會帶來一些挑戰,例如,預熱和關閉都會花費很長的時間,如果有很多髒資料在緩衝池裡,innodb關閉時可能會花費比較長的時間因為關閉之前需要把髒頁寫回資料檔案,也可以強制關閉
,但是重啟的時候需要做很多恢復工作,也就是說無法加快關閉和重啟,如果事先知道需要關閉innodb,可以在執行的時候修改innodb_max_dirty_pages_pct 變數,將值進行改小,等待資料重新整理執行緒進行
清理緩衝池,然後在髒頁數量較小的時候關閉,可以監控the innodb_buffer_pool_pages_dirty狀態的變數或者使用innotop來監控show innodb status來觀察髒頁的重新整理量。
mysql記憶體結構 MySQL記憶體結構
實際上mysql記憶體的組成和oracle類似,也可以分為sga 系統全域性區 和pga 程式快取區 mysql show variables like buffer 一 sga 1.innodb buffer bool 用來快取innodb表的資料 索引 插入緩衝 資料字典等資訊。2.innodb...
mysql記憶體釋放 MySQL記憶體不釋放
歡迎進入linux社群論壇,與200萬技術人員互動交流 進入 連線了一下,並進行了一次查詢操作 root nj 245 thu apr 24 16 38 38 2014 information schema select count from client statistics count 5 1 ...
mysql 記憶體使用 mysql記憶體使用分析 一
author skate time 2012 02 16 mysql記憶體使用分析 從記憶體的使用方式來說,mysql的記憶體使用主要分為以下兩類 1.執行緒獨享記憶體 2.全域性共享記憶體 1.執行緒獨享記憶體 在mysql 中,執行緒獨享記憶體主要用於各客戶端連線線程儲存各種操作的獨享資料,如執...