MySQL最大内存使用量


111

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

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


4
MySQL不会“为每个新查询占用内存并最终耗尽内存”。内存使用情况要复杂得多。
瑞克·詹姆斯

Answers:


183

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并提供诸如行锁定的功能,UPDATEMyISAM在写入表时锁定整个表。

如果您有自由在自己的基础架构上运行MySQL,则可能还需要检出percona服务器,因为其中包括来自Facebook和Google等公司(他们很快就知道)的许多贡献,其中还包括Percona自己的drop-在更换InnoDB,叫XtraDB

有关Percona服务器(和-client)设置(在Ubuntu上),请参见我的要旨:http ://gist.github.com/637669

尺寸

数据库的大小非常非常重要-信不信由你,Intarwebs上的大多数人从未处理过大型的,无法编写密集的MySQL设置,但确实存在。某些人会恶作剧并说出类似“使用PostgreSQL !!! 111”的字眼,但现在让我们忽略它们。

底线是:从大小上判断,将决定硬件。您无法真正使80 GB的数据库在1 GB的RAM上快速运行。

指标

不是:更多,更好。仅需要设置索引,并且必须使用来检查其用法EXPLAIN。另外,MySQL的EXPLAIN功能确实有限,但这只是一个开始。

建议配置

关于这些my-large.cnfmy-medium.cnf文件-我甚至不知道谁是那些书面。自己动手。

调音底漆

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

调音入门不是魔术酱。您仍然应该阅读所有建议更改的变量。

我真的很喜欢推荐mysqlperformanceblog。对于各种与MySQL相关的技巧,这是一个很好的资源。而且不仅是MySQL,他们还对正确的硬件有很多了解,或者为AWS建议安装等。这些人有多年的经验。

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


我不知道tuning primer,和它相比如何mysqltuner
greg0ire 2014年

38

我们使用以下设置:

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

16
我认为您(以及您链接到的作者)对query_cache_size和query_cache_limit的理解是错误的。您正在告诉MySQL:分配1MB的缓存,但不要在其中输入大于128MB的任何查询。dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
agtb

我会降低max_connections。我会决定使用哪个引擎,而不是为两者分配大量空间。
瑞克·詹姆斯

19

数据库内存使用是一个复杂的主题。在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

2
嗨!感谢您的回答。我注意到人们引用的等式如下:key_buffer_size +(read_buffer_size + sort_buffer_size)* max_connections =总内存。我设置了以下内容:key_buffer_size = 128M,read_buffer_size = 1M,sort_buffer_size = 2M,max_connections = 120,服务器上的总内存为512M。但是,经过多次查询后,可用内存已低至12M,并且可能会随着进一步的使用而继续减少。是否有这样的原因并且可以预防?谢谢!

或者,也许我需要考虑的不是服务器上的总内存(512M),而是空闲内存(即加载所有与操作系统相关的程序和其他程序之后可用的内存)?

1
如果您打算修改tmp_table_size以增加可以存储在RAM中的临时表的大小,请记住也要增加max_heap_table_size-因为MySQL使用两者中的最小值...
Dave Rix

1
@TimothyMilsud-没有像这样的公式真正起作用。当一个公式声称使用了过多的RAM时,大多数服务器运行都很好。
瑞克·詹姆斯

19

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

table_definition_cache = 400

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


这是什么部分?我将其添加到我的服务中,但拒绝启动。
语法错误

没关系,我将其移至[wampmysqld]下,效果很好,并大大减少了我正在使用的内存。我认为这可能也加快了我的本地主机页面加载的速度,现在看来它们更快。
语法错误

尽管默认和最小值为400,但在您的情况下是什么使它高于400?
Wadih M.19年

5

/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内存的服务器上运行良好。


为什么table_definition_cache= 0?一些解释会很好。而且您基本上不缓存查询...如果您有同样的效果query_cache_type = 0:)
Khom Nazid '19

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-默认身份验证插件= mysql_native_password

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.