MySQL最大的内存使用量

我想知道如何设置MySQL在Linux服务器上使用的内存量的上限。

现在,MySQL将继续占用每一个新查询请求的内存,以便最终耗尽内存。 有没有办法限制MySQL的使用量不超过这个数量?

MySQL的最大内存使用量取决于硬件,设置数据库本身。

硬件

硬件是显而易见的部分。 更多的内存越来越多,更快的磁盘ftw 。 不要相信那些每月或每周的新闻信件。 MySQL不会扩展线性,即使在Oracle硬件上也是如此。 这比这个有点棘手。

底线是:对于你的 MySQL设置推荐什么,没有一般的经验法则。 这一切都取决于当前的使用情况或预测。

设置和数据库

MySQL提供无数的variables和开关来优化其行为。 如果遇到问题,你真的需要坐下来阅读(f'ing)手册。

至于数据库 – 几个重要的限制:

  • 表引擎( InnoDBMyISAM ,…)
  • 尺寸
  • 指数
  • 用法

大多数MySQL的技巧在stackoverflow将告诉你约5-8所谓的重要设置。 首先,并不是所有这些都是重要的 – 例如,为InnoDB分配大量资源,而不使用InnoDB并没有什么意义,因为这些资源被浪费了。

或者 – 很多人build议使用max_connectionvariables – 他们知道这一点也意味着MySQL将分配更多资源来满足这些max_connections – 如果需要的话。 更明显的解决scheme可能是closuresDBAL中的数据库连接,或者降低wait_timeout来释放这些线程。

如果你赶上了我的漂移 – 真的很多,很多要阅读和学习。

引擎

表引擎是一个非常重要的决定,许多人早先忘记了那些,然后突然发现自己与一个30 GB大小的MyISAM表进行斗争,该表locking并阻止了他们的整个应用程序。

我并不是说MyISAM很糟糕 ,但InnoDB可以调整为响应几乎或几乎与MyISAM一样快,并提供诸如UPDATE上的行locking之类的事情,而MyISAM在写入时locking整个表。

如果你可以自由地在自己的基础架构上运行MySQL,那么你可能也想看看percona服务器,因为在包括Facebook和Google等公司(他们知道的很快)的许多贡献中,还包括Percona自己的下拉菜单,取代InnoDB ,称为XtraDB

percona-server(和-client)安装(在Ubuntu上)请看我的要点: http ://gist.github.com/637669

尺寸

数据库的大小是非常非常重要的 – 不pipe你信不信,Intarwebs上的大多数人从来没有处理过大量的MySQL,但是这些设置确实存在。 有些人会大吼大叫,说“使用PostgreSQL !!! 111”,但现在让我们忽略它们。

底线是:从规模来看,硬件的决定是要做的。 在1 GB的RAM上,你无法真正使80 GB的数据库运行得更快。

指数

这不是:越多越好。 只需要设置需要的索引,并使用EXPLAIN来检查。 再加上MySQL的EXPLAIN实际上是有限的,但这是一个开始。

build议的configuration

关于这些my-large.cnf my-medium.cnfmy-medium.cnf文件 – 我甚至不知道是谁写的。 滚动你自己的。

调整底漆

调优引物是一个很好的开始。 这是一个bash脚本(提示:你将需要linux),它接受SHOW VARIABLESSHOW STATUS的输出,并将其包装成希望有用的build议。 如果您的服务器已经运行了一段时间,build议将会更好,因为将有数据为基础。

调整底漆不是一个神奇的酱虽然。 你仍然应该阅读它所build议改变的所有variables。

我真的很想推荐mysqlperformanceblog 。 对于各种MySQL相关的技巧来说,这是一个很好的资源。 这不仅仅是MySQL,他们也了解很多关于AWS的正确硬件或推荐设置等等。这些人有着多年的经验。

当然,另一个很好的资源是planet-mysql 。

我们使用这些设置:

 etc/my.cnf innodb_buffer_pool_size = 384M key_buffer = 256M query_cache_size = 1M query_cache_limit = 128M thread_cache_size = 8 max_connections = 400 innodb_lock_wait_timeout = 100 

对于具有以下规格的服务器:

 Dell Server CPU cores: Two Processor(s): 1x Dual Xeon Clock Speed: >= 2.33GHz RAM: 2 GBytes Disks: 1×250 GB SATA 

数据库内存使用是一个复杂的话题。 MySQL性能博客在覆盖您的问题方面做得很好,并列举了为什么“保留”内存非常不切实际的许多原因。

如果你真的想强加限制,你可以这样做,但是你必须在操作系统级别做,因为没有内置的设置。 在linux中,你可以使用ulimit ,但是你可能需要修改MySQL的启动方式来实现这一点。


最好的解决scheme是closures服务器,这样,通常的MySQL内存设置的组合将会降低MySQL安装的内存使用量。 这当然会对数据库的性能产生负面影响,但是您可以在my.ini中调整一些设置:

 key_buffer_size query_cache_size query_cache_limit table_cache max_connections tmp_table_size innodb_buffer_pool_size 

我会从那里开始,看看你是否能得到你想要的结果。 有很多关于调整MySQL内存设置的文章。


编辑:

请注意, 在较新的5.1.x版MySQL中 ,一些variables名已经改变 。

例如:

 table_cache 

就是现在:

 table_open_cache 

mysqld.exe在RAM中使用了480 MB。 我发现我把这个参数添加到my.ini

 table_definition_cache = 400 

将内存使用量从400,000+下降到105,000kb

/etc/my.cnf

 [mysqld] ... performance_schema = 0 table_cache = 0 table_definition_cache = 0 max-connect-errors = 10000 query_cache_size = 0 query_cache_limit = 0 ... 

在256MB内存的服务器上工作良好。