原文:http://www.mysqlperformanceblog.com/2006/05/30/innodb-memory-usage/
有很多問題是有關InnoDB如何分配內存的。這裡我試圖解釋下啟動時內存的分配情況。先列出重要的常量:
NBLOCKS=innoDB緩沖池的塊數量= innodb_buffer_pool_size / 16384
OS_THREADS = if (innodb_buffer_pool_size >= 1000Mb) = 50000
else if (innodb_buffer_pool_size >= 8Mb) = 10000
else = 1000 (對於Linux這類系統是正確的,對於Windows則有另一個計算方式)
所以InnoDB使用的內存量:
l innodb緩沖池內存
l innodb額外內存池大小
l innodb記錄緩沖大小
l 自適應哈希索引, 大小= innodb緩沖池 / 64
l 系統目錄哈希, 大小 = 6 * innodb緩沖池 / 512
l 同步數組(sync_array)使用的內存,為同步單元利用,大小 = OS_THREADS * 152
l 系統事件(os_events)的內存, 也為同步單元利用,大小= OS_THREADS * 216
l 系統鎖定的內存, 大小=5 * 4 * NBLOCKS
所以,最後的innodb的公式:
緩沖池大小+緩沖記錄大小+額外內存池大小+ 812 / 16384 * 緩沖池大小 + OS_THREADS * 368
為簡單起見:812 / 16384 * 緩沖池大小 ~~ 緩沖池大小/ 20
和 OS_THREADS*368 = 17.5MB 如果緩沖池大小> 1000MB
= 3.5MB 如果 緩沖池大小> 8MB
舉個例子,比如你的緩沖池大小=1500M,額外內存池大小=20M,記錄緩沖大小=8M,那麼InnoDB分配的內存= 1500M + 20M + 8M + 1500/20M + 17.5M = 1620.5M.
在你計劃利用你的服務器內存時,你要考慮到額外內存的利用。
硬盤是你家的書櫃,用來保存書籍的;內存是你家的寫字桌台面,用來做事的,台面再大,書櫃不變。明白了沒有朋友?
術語點說呢就是,內存是臨時存貯器。硬盤是永久存儲器。
供參考。
系統會自動分配的,當不夠時,就是分享內存,但是你的顯卡要支持動態內存才可以。