Documentation Home
MySQL 8.0 参考手册  / 第 15 章 InnoDB 存储引擎  / 15.8 InnoDB配置  /  14.8.4 为 InnoDB 配置内存分配器

14.8.4 为 InnoDB 配置内存分配器

InnoDB开发时,随操作系统和运行时库提供的内存分配器通常缺乏性能和可扩展性。那时,还没有针对多核 CPU 调整的内存分配器库。因此,在子系统InnoDB中实现了自己的内存分配器。mem这个分配器由一个互斥体保护,这可能成为一个 瓶颈InnoDB还围绕系统分配器 (mallocfree) 实现了一个包装器接口,该接口同样由单个互斥锁保护。

今天,随着多核系统变得越来越广泛,并且随着操作系统的成熟,操作系统提供的内存分配器已经有了显着的改进。与过去相比,这些新的内存分配器性能更好,可扩展性更强。大多数工作负载,尤其是那些频繁分配和释放内存的工作负载(例如多表连接),都受益于使用高度优化的内存分配器,而不是内部特定的 InnoDB内存分配器。

您可以通过在 MySQL 选项文件(或 )InnoDB中设置系统配置参数的值来控制是使用自己的内存分配器还是操作系统的分配器 。如果设置为or (默认值),则使用底层系统的和 函数而不是管理内存池本身。该参数不是动态的,只有在系统启动时才会生效。要继续使用 内存分配器,请设置 为 。 innodb_use_sys_mallocmy.cnfmy.iniON1InnoDBmallocfreeInnoDBinnodb_use_sys_malloc0

InnoDB内存分配器被禁用时, InnoDB忽略参数的值 innodb_additional_mem_pool_size。内存分配器使用额外的InnoDB内存池来满足分配请求,而不必退回到系统内存分配器。当 InnoDB内存分配器被禁用时,所有此类分配请求都由系统内存分配器完成。

在使用动态链接的类 Unix 系统上,替换内存分配器可能就像创建环境变量 LD_PRELOADLD_LIBRARY_PATH指向实现分配器的动态库一样简单。在其他系统上,可能需要重新链接。请参阅您选择的内存分配器库的文档。

由于InnoDB在使用系统内存分配器时无法跟踪所有内存使用情况(innodb_use_sys_mallocON),命令输出中的BUFFER POOL AND MEMORYSHOW ENGINE INNODB STATUS部分仅包括Total memory allocated中的缓冲池统计信息。mem使用子系统或使用 分配的任何内存ut_malloc都被排除在外。

笔记

innodb_use_sys_mallocinnodb_additional_mem_pool_size 在 MySQL 5.6.3 中弃用并在 MySQL 5.7.4 中删除。

有关 InnoDB内存使用的性能影响的更多信息,请参阅 第 8.10 节,“缓冲和缓存”