MyISAM 表的性能设置 - 将所有内容保存在内存中

Vla*_*anu 6 mysql myisam mysql-5 performance

我有一个 8 核 MySQL 服务器,32 GB RAM,保存 40 个 MyISAM 表(总计:~4GB 数据)。由于数据库大小比可用内存小几倍,我如何才能充分利用我的服务器资源?

  1. 我应该尝试在 my.cnf 中配置哪些设置?

  2. 我可以强制数据 + 索引留在内存中吗?

Aar*_*own 6

MySQL 只缓存 MySQL 内存中的索引,而不是数据。数据仅由底层操作系统的文件系统缓存进行缓存。在 my.cnf 中调整的最重要的值是key_buffer_size它将为 MyISAM 分配内存以缓存索引。

但是,除非您有使用 MyISAM 表的特定原因,否则您应该将这些表转换为 InnoDB。在当今时代,使用 MyISAM 的理由并不多,而且 MyISAM 不利于并发性、数据完整性或崩溃恢复。

如果您切换到 InnoDB,最重要的设置是innodb_buffer_pool_size将缓存数据页和索引的内部内存缓存。其他要考虑的事情是innodb_log_file_size并确保设置innodb_file_per_table=1。4GB数据+索引,设置 innodb_buffer_pool_size=4G合理。如果您在高度并发的环境中运行,则可以试验innodb_thread_concurrency. 我的建议是从 innodb_thread_concurrency=0 开始,但您可能会发现有必要根据您的工作负载和 MySQL 版本将其显式设置为 4-8 之间的某个值。


Rol*_*DBA 5

我同意 Aaron (+1) 的观点,您应该使用 InnoDB,因为您无法为 MyISAM 缓存数据。

以下是您应该关注的设置

我的推荐

您应该升级到 MySQL 5.5,因为有新的设置可以通过增加的超线程来使用多个内核。这些选项存在于 MySQL 5.1 从 5.1.38 开始,但仅在 InnoDB Plugin 中。升级到 5.5 比尝试嵌入 InnoDB 插件更简单、更实用。