我想知道如何在Linux服务器上设置MySQL使用内存的上限。
目前,每次请求新查询时,MySQL都会继续占用内存,以至于最终会耗尽内存。是否有一种方法可以设置一个上限,以便MySQL不会使用超过该数量的内存?
MyISAM
表格作斗争,它会锁定并阻塞整个应用程序。InnoDB
可以被调整为几乎或接近于MyISAM
的反应速度,并且提供了诸如UPDATE
上的行锁定等功能,而MyISAM
在写入时锁定整个表格。InnoDB
的可插拔替换,称为XtraDB
。总之,从规模上来看,需要做出关于硬件的决策。在1GB的RAM上,你无法使80GB的数据库运行速度快。
并不是越多越好。只有需要设置的索引才需要设置,并且必须使用EXPLAIN
进行检查。此外,MySQL的EXPLAIN
非常有限,但它是一个开始。
关于这些my-large.cnf
和my-medium.cnf
文件 - 我甚至不知道它们是为谁编写的。自己动手吧。
一个很好的起点是tuning primer。它是一个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
innodb_buffer_pool_size
和 table_definition_cache
就可以帮助很多了。 - Dave Ankinmysqld.exe在内存中使用了480MB。我发现我将这个参数添加到了my.ini文件中。
table_definition_cache = 400
将内存使用量从400,000+ kb降至105,000kb
数据库内存使用是一个复杂的话题。 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内存设置的问题,这里和这里都有。
编辑:
请注意,一些变量名称在新版本的MySQL 5.1.x中已更改。
例如:
table_cache
现在是:
table_open_cache
/etc/my.cnf
中:[mysqld]
...
performance_schema = 0
table_cache = 0
table_definition_cache = 0
max_connect_errors = 10
query_cache_size = 0
query_cache_limit = 0
...
服务器只有256MB的内存,工作表现很不错。
table_definition_cache
= 0?能否解释一下原因。而且你基本上没有缓存查询...如果你将 query_cache_type = 0
,那么效果是相同的 :) - Khom Nazid由于我没有足够的声望点来为之前的答案点赞,我同意“table_definition_cache = 400”这个答案适用于我的旧Centos服务器。
Connection_errors_internal
。 - Rick James