仅使用InnoDB(5gb数据库)的8gb RAM专用MySQL服务器的最佳MySQL缓存设置


20

在设置MySQL性能方面,我是一个非常大的菜鸟。老实说,我并不担心微调以压缩MySQL的所有性能,但我确实知道,提供某些最佳结果的最重要的事情是正确设置缓存/缓冲区。

我试图通过仅使用InnoDB作为存储引擎来简化事情。我确实有一个专用于MySQL的服务器。它有8gb的RAM,我应该如何分配它以最大化性能?我希望能够将我的整个数据库放入内存中以获得最佳性能。该数据库约为5gb。这可能吗?

我应该为查询缓存分配多少内存?InnoDB缓冲池要多少钱?其余计算机(即非MySQL相关进程)需要多少钱?等等。

由于我没有使用MyISAM,因此我真的不需要在正确的密钥缓存中放置很多内存吗?

Answers:


25

在不了解数据库本身的情况下,这很难。您应该注意一些工具。

关于将整个数据库存储在内存中;在数据库上执行更改的所有查询将保持打开状态,直到在磁盘上执行写操作为止。唯一可以避免磁盘成为瓶颈的是带有写缓存的磁盘控制器。

我将从默认值的以下更改开始:

key_buffer_size = 128M
thread_stack = 128K
thread_cache_size = 8
table_cache = 8192
max_heap_table_size = 256M
query_cache_limit = 4M
query_cache_size = 512M

innodb_buffer_pool_size = 4G 

# This is crucial to avoid checkpointing all the time:
innodb_log_file_size = 512M

# If you have control on who consumes the DB, and you don't use hostnames when you've set up permissions - this can help as well.
skip_name_resolve

然后,我将看看情况如何,并根据上述工具的输出(除其他事项外)尝试其他操作。我还要确保使用监视工具(例如MuninCacti)绘制趋势图,以查看我实际处理的工作量。就个人而言,我对Munin随附的MySQL插件有丰富的经验。


谢谢,我给这个镜头,看看我是否可以学到新东西。
billmalarky 2011年

@billmalarky欢迎来到serverfault!:)如果您对得到的答案感到满意,请记住要投票或将问题标记为正确。
克维斯尔(Kvisle)2011年

+1推荐mysqltuner.pl !!!
RolandoMySQLDBA 2011年

@Kvisle谢谢您的欢迎!我已经在stackoverflow上待了一段时间(嗯...几个月了...),但是我是serverfault的新手。我实际上是用voxel.net托管的,他们的托管托管(IE系统支持)确实很棒,但我认为也应该寻求外部视角,因此在与他们交谈时我听起来并不像一个完整的工具。
billmalarky 2011年

1
@Kvisle另外,我将标记一个正确的答案,但我确实希望将其炖一下以引起良好的头脑风暴。
billmalarky 2011年

9

恕我直言,你应该能够去

innodb_buffer_pool_size=5G

那将是62.5%的RAM,其中有足够的RAM用于服务器OS,另外还有用于DB连接的内存

@kvisle建议使用mysqltuner.pl。该脚本非常适合判断专用于join_buffer_size,sort_buffer_size,read_buffer_size和read_rnd_buffer_size的RAM数量。将这4个缓冲区加在一起就乘以max_connections。该答案将添加到静态缓冲区(innodb_buffer_pool_size + key_buffer_size)。报告合并的总和。如果总和超过RAM的80%,则必须减小这些缓冲区的大小。mysqltuner.pl在这方面将非常有帮助。

由于所有数据都是InnoDB,因此可以使key_buffer_size(用于MyISAM索引的键缓存缓冲区)非常低(我建议为64M)。

这是我在DBA StackExchange中发表的帖子,用于计算建议的innodb_buffer_pool_size大小

更新2011-10-15 19:55 EDT

如果您知道将有5GB的数据,那么我的第一个建议是确定。但是,我忘了添加一件事:

[mysqld]
innodb_buffer_pool_size=5G
innodb_log_file_size=1280M

日志文件大小必须是InnoDB缓冲池的25%

更新2011-10-16 13:36 EDT

25%规则严格基于使用两个日志文件。虽然可以使用多个innodb日志文件,但通常两个文件效果最佳。

其他人表示使用25%

但是,公平地说,最初的InnoBase Oy公司的某人表示不使用25%规则,因为具有更大的InnoDB缓冲池

自然,当拥有大量RAM时,25%规则将不起作用。实际上,仅使用两个日志文件所允许的最大innodb_log_file_size为2047M,因为日志文件的组合大小必须小于4G(4096M)

案例介绍:我的一位雇主客户有一个带有192GB RAM的数据库服务器。无法获取48G日志文件。我将innodb日志文件的最大文件大小设置为2047M。@Kvisle对我的回答的评论只是提供了一个链接,指出您不必将自己限制为两个日志文件。如果您有N个日志文件,则它们总共不能达到4G。我的25%规则只是一个完美的世界(8 GB或更少的DB Server)。


谢谢,我一定会使用mysqltuner.pl。但是,我必须问,如果我的数据库现在为空,该脚本是否仍然正确?我已经正确设置了所有表和架构,但没有实际数据。我以5gb作为示例大小,我将在当前的专用服务器上使用该大小(即,一旦数据库变得更大,我可能会切换到更好的专用服务器)。当前数据库是空的(这是一个尚未启动的全新站点),但是我想调整mysql以在启动前很好地进行扩展。
billmalarky 2011年

更新了我的答案!
RolandoMySQLDBA 2011年

我想评论“必须是InnoDB缓冲池的25%”。因为它不是100%正确。阅读dev.mysql.com/doc/refman/5.0/en/…以获得更详尽的答案。从性能角度来看,将大小从默认值稍微增加一点很有帮助,但是您不必最大化它。
克维斯尔(Kvisle)2011年

罗兰多,谢谢您的帮助。我已将此线程添加为书签,以供参考。另外,我现在正在使用该mysqltuner脚本。
billmalarky 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.