【笔记】InnoDB内存分配_MySQL
有很多问题是有关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.
在你计划利用你的服务器内存时,你要考虑到额外内存的利用。