我想知道如何设置MySQL在Linux服务器上使用的内存量的上限.
现在,MySQL会在每次请求的新查询中继续占用内存,以便最终耗尽内存.有没有办法设置一个限制,以便MySQL不使用这个数量?
MySQL的最大内存使用量在很大程度上取决于硬件,设置和数据库本身.
硬件是显而易见的部分.更好的RAM,更快的磁盘ftw.不要相信那些每月或每周的新闻信件.MySQL不会线性扩展 - 甚至不能在Oracle硬件上扩展.这有点棘手.
底线是:有经验的,什么是推荐不一般的规则你的MySQL安装.这一切都取决于当前的使用情况或预测.
MySQL提供无数变量和开关来优化其行为.如果遇到问题,你真的需要坐下来阅读(f'ing)手册.
至于数据库 - 一些重要的约束:
台发动机(InnoDB
,MyISAM
,...)
尺寸
指数
用法
stackoverflow上的大多数MySQL技巧都会告诉你5-8所谓的重要设置.首先,并非所有这些都很重要 - 例如,为InnoDB分配大量资源而不使用InnoDB并没有多大意义,因为这些资源被浪费了.
或者 - 很多人建议改变max_connection
变量 - 好吧,他们知道它也意味着MySQL会分配更多的资源来满足那些max_connections
- 如果需要的话.更明显的解决方案可能是关闭DBAL中的数据库连接或降低wait_timeout
释放这些线程.
如果你抓住了我的漂移 - 那里真的很多,很多东西可以阅读和学习.
表引擎是一个非常重要的决定,许多人在早期就忘记了这些,然后突然发现自己正在与一个30 GB大小的MyISAM
表进行斗争,这些表会锁定并阻止它们的整个应用程序.
我并不是说MyISAM很糟糕,但InnoDB
可以调整几乎或几乎一样快地响应MyISAM
并提供行锁定等功能,UPDATE
而MyISAM
在写入时锁定整个表.
如果您可以自己在自己的基础架构上运行MySQL,您可能还想查看percona服务器,因为其中包括来自Facebook和Google等公司的很多贡献(他们知道速度很快),它还包括Percona自己的drop-替换InnoDB
,称为XtraDB
.
请参阅我的要点,了解percona-server(和-client)设置(在Ubuntu上):http://gist.github.com/637669
数据库大小非常非常重要 - 不管你信不信,Intarwebs上的大多数人从来没有处理过大而且编写强烈的MySQL设置,但这些确实存在.有些人会说"使用PostgreSQL !!! 111"之类的东西,但现在让我们忽略它们.
底线是:从尺寸来判断,有关硬件的决定.您无法在1 GB的RAM上快速运行80 GB的数据库.
它不是:越多越好.只需要设置所需的索引,并且必须检查使用情况EXPLAIN
.除此之外,MySQL EXPLAIN
的确是有限的,但它是一个开始.
关于这些my-large.cnf
和my-medium.cnf
文件 - 我甚至不知道是谁写的.滚动你自己.
一个很好的开始是调整底漆.这是一个bash脚本(提示:你需要的Linux),这需要的输出SHOW VARIABLES
,并SHOW STATUS
和它包装成希望有用的建议.如果您的服务器运行了一段时间,建议会更好,因为将有数据基于它们.
虽然调音底漆不是神奇的酱汁.您仍应阅读它建议更改的所有变量.
我真的很想推荐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启动的方式来强加它.
最好的解决方案是调低服务器,以便通常的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中,某些变量名称已更改.
例如:
table_cache
就是现在:
table_open_cache
mysqld.exe在RAM中使用480 MB.我发现我将此参数添加到my.ini中
table_definition_cache = 400
将内存使用量从400,000+ kb减少到105,000kb