Vla*_*anu 6 mysql myisam mysql-5 performance
我有一个 8 核 MySQL 服务器,32 GB RAM,保存 40 个 MyISAM 表(总计:~4GB 数据)。由于数据库大小比可用内存小几倍,我如何才能充分利用我的服务器资源?
我应该尝试在 my.cnf 中配置哪些设置?
我可以强制数据 + 索引留在内存中吗?
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 之间的某个值。
我同意 Aaron (+1) 的观点,您应该使用 InnoDB,因为您无法为 MyISAM 缓存数据。
以下是您应该关注的设置
innodb_buffer_pool_size:虽然您有 4GB 的数据并且将 innodb_buffer_pool_size 设置为 4G 就足够了,但我建议将 innodb_buffer_pool_size 设置为 8G。为什么 ?如果发生任何批量操作,您基本上会清除 innodb 缓冲池的部分或全部内容。
innodb_log_file_size:至于innodb_log_file_size,应该设置为最大值,即2047M。如果您已经有默认大小 5M 的日志文件,则必须调整它们的大小。
innodb_file_per_table:无论如何,设置这个。如果不这样做,称为 ibdata1 的 InnoDB 系统文件将不受控制地增长。如果您已经在 ibdata1 中加载了表,您将需要清理 InnoDB 基础设施以保持 ibdata1 尽可能小。
innodb_thread_concurrency:默认值为零(0),应该保持这种方式。我写了一篇较早的文章,描述了如何以及为什么。
您应该升级到 MySQL 5.5,因为有新的设置可以通过增加的超线程来使用多个内核。这些选项存在于 MySQL 5.1 从 5.1.38 开始,但仅在 InnoDB Plugin 中。升级到 5.5 比尝试嵌入 InnoDB 插件更简单、更实用。