標籤:

簡單說明下MySQL的內存使用

簡單說明下MySQL的內存使用。

現在大內存機器已經成為互聯網公司的標配,對於內存的優化已經不像以前顯得那麼重要,然而,我們還是有必要了解一些MySQL內存使用的知識,這會讓我們的調優更有效果,也避免可能出現的故障,比如OOM。

1、MySQL使用內存一般有兩大塊,如果你使用MyISAM,需要關注留給索引緩存的內存,參數是Key_buffer_size,如果你使用的InnoDB,需要關注的參數是 innodb_buffer_pool_size,它定義了我們分配給資料庫數據緩衝池的內存大小。

對於一些MySQL基於自身管理目的分配的內存,我們並沒有什麼手段去調整和優化,我們主要優化的是數據操作階段的內存使用,這方面也是內存的大頭所在,我們可以從全局和會話兩個級別進行調整。

對於一些全局分配的內存,如key_buffer_size, query_cache_size etc,在系統啟動之初,就會完成初始化分配,分配所有內存。對於另外的一些涉及到查詢行為的內存參數,比如read_buffer_size, sort_buffer_size, join_buffer_size,MySQL在查詢需要的時候才分配這些內存,我們需要留意這些參數不要設置得過大,因為如果真的查詢需要使用到這部分內存,而你又擁有大量的連接,那麼可能無謂的浪費大量內存。具體的還有許多內存相關的參數,大家可以查詢官方文檔,具體不再贅述。

2、如果希望內存盡量節省,我們應該盡量基於主鍵進行檢索,要充分利用索引篩選記錄和排序記錄。

3、一些非核心功能的特性,比如存儲過程、分區表,可能導致大量的內存被使用而未釋放,而你卻很難去調優。

4、我們會觀察到,實際MySQL使用的內存會比 innodb_buffer_pool_size 這個參數設置的要大10%左右,當你要設置一個很大的 innodb_buffer_pool_size 的時候,這些額外的元數據管理開銷你要留意。

5、建議MyISAM和InnoDB不要混用。

6、許多實踐證明,Linux系統默認的內存分配器對於多線程內存分配管理不佳,如果你需要極致的性能,建議使用 jemalloc 或者 tcmalloc代替之,在核數多於8核的情況下, jemalloc 或者 tcmalloc會表現的出色的多。


推薦閱讀:

Mysql佔用CPU過高如何優化?
PHP擴展 Mysql 與 Mysqli
MySQL 對於千萬級的大表要怎麼優化?

TAG:MySQL |