MySQL最大内存使用量

时间:2009-07-24 16:28:43

标签: mysql memory ram

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

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

6 个答案:

答案 0 :(得分:173)

MySQL的最大内存使用量在很大程度上取决于硬件,您的设置数据库本身。

硬件

硬件是显而易见的部分。 RAM越多,磁盘越快 ftw 。不要相信那些每月或每周的新闻信件。 MySQL不会线性扩展 - 甚至不能在Oracle硬件上扩展。这有点棘手。

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

设置&数据库

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

至于数据库 - 一些重要的限制因素:

  • 表格引擎(InnoDBMyISAM,...)
  • 尺寸
  • 索引
  • 使用

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

或者 - 很多人建议使用max_connection变量 - 好吧,他们知道这也意味着MySQL会分配更多资源来满足那些max_connections - 如果需要的话。更明显的解决方案可能是关闭DBAL中的数据库连接或降低wait_timeout以释放这些线程。

如果你抓住了我的漂移 - 那里有很多很多东西需要阅读和学习。

发动机

表引擎是一个非常重要的决定,许多人在早期就忘记了这些,然后突然发现自己正在与一个30 GB大小的MyISAM表进行斗争,这些表会锁定并阻止整个应用程序。

我不是说 MyISAM很糟糕,但InnoDB可以调整为几乎或几乎与MyISAM一样快,并提供行锁定等功能在UPDATE上,而MyISAM在写入时锁定整个表。

如果您可以自己在自己的基础架构上运行MySQL,那么您可能还想查看percona server,因为其中包括来自Facebook和Google等公司的很多贡献(他们知道速度很快),它还包括Percona自己的InnoDB替代品,名为XtraDB

请参阅mycona-server(和-client)设置(在Ubuntu上):http://gist.github.com/637669

尺寸

数据库大小非常非常重要 - 信不信由你,Intarwebs上的大多数人从来没有处理过大而且编写强烈的MySQL设置,但这些确实存在。有些人会说“使用PostgreSQL !!! 111”之类的话,但是现在让我们忽略它们。

底线是:从尺寸来判断,有关硬件的决定。你不能真正让1 GB的80 GB数据库快速运行 GB的RAM。

指数

不是:越多越好。只需设置所需的索引,并且必须使用EXPLAIN检查使用情况。除此之外,MySQL的EXPLAIN确实有限,但这是一个开始。

建议的配置

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

调谐引物

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

虽然调音底漆不是神奇的酱汁。你仍然应该阅读它建议改变的所有变量。

我真的很想推荐mysqlperformanceblog。它是各种MySQL相关技巧的绝佳资源。它不仅仅是MySQL,它们也非常了解合适的硬件或推荐AWS的设置等。这些人有多年的经验。

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

答案 1 :(得分:35)

我们使用以下设置:

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

答案 2 :(得分:19)

数据库内存使用是一个复杂的主题。 MySQL Performance Blog很好地涵盖了你的问题,并列出了为什么“保留”记忆非常不切实际的许多原因。

如果你真的想要施加硬限制,你可以这样做,但你必须在操作系统级别这样做,因为没有内置设置。在linux中,您可以使用ulimit,但是您可能必须修改MySQL启动的方式才能强制执行此操作。


最佳解决方案是调低服务器,以便通常的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内存设置,有many articles


编辑:

请注意一些变量名称have changed in the newer 5.1.x releases of MySQL

例如:

table_cache

现在:

table_open_cache

答案 3 :(得分:17)

mysqld.exe在RAM中使用480 MB。我发现我将此参数添加到my.ini

table_definition_cache = 400

将内存使用量从400,000+ kb减少到105,000kb

答案 4 :(得分:2)

/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内存的服务器上做得很好。

答案 5 :(得分:0)

如果您要优化docker mysql容器,则以下命令可能会有所帮助。我能够将mysql docker容器从默认的480mb运行到仅100 mbs

docker run -d -p 3306:3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD =太-e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql:/ var / lib / mysql --name mysqldb mysql- table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password