MySQL最大内存使用

dm7nw8vv  于 11个月前  发布在  Mysql
关注(0)|答案(7)|浏览(149)

我想知道如何设置MySQL在Linux服务器上使用的内存量的上限。
现在,MySQL将继续占用内存与每一个新的查询请求,使它最终耗尽内存。有没有一种方法来设置限制,使不超过该数量是由MySQL使用?

xkftehaa

xkftehaa1#

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

硬件

硬件是显而易见的部分。RAM越多,磁盘就越快。不过不要相信那些每月或每周的新闻。MySQL不会线性扩展-即使在Oracle硬件上也不会。这比这要复杂一些。
底线是:对于MySQL的安装,我们没有一个通用的经验法则。2这完全取决于当前的使用情况或预测。

设置和数据库

MySQL提供了无数的变量和开关来优化它的行为。如果你遇到问题,你真的需要坐下来阅读(f 'ing)手册。
至于数据库,有几个重要的限制:

  • 表引擎(InnoDBMyISAM,.)
  • 大小
  • 指数
  • 使用

大多数MySQL关于stackoverflow的提示会告诉你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
请参阅我的要点percona服务器(和客户端)设置(在Ubuntu上):http://gist.github.com/637669

大小

数据库的大小是非常非常重要的--信不信由你,Intarwebs上的大多数人从来没有处理过一个大的、写密集的MySQL设置,但这些确实存在。有些人会说,“使用PostgreSQL!111”,但我们现在忽略它们。
底线是:从大小来判断,关于硬件的决定是要做出的。你不能真正让一个80 GB的数据库在1 GB的RAM上快速运行。

索引

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

建议配置

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

调优入门

tuning primer是一个很好的开始。它是一个bash脚本(提示:你需要Linux),它接受SHOW VARIABLESSHOW STATUS的输出,并将其 Package 成有用的推荐。如果你的服务器已经运行了一段时间,推荐会更好,因为会有数据作为基础。
调优入门并不是一个神奇的酱料,你仍然应该阅读它建议改变的所有变量。

阅读

我真的很喜欢推荐mysqlperformanceblog。这是一个很好的资源,可以提供各种与MySQL相关的技巧。而且不仅仅是MySQL,他们还知道很多关于正确的硬件或推荐AWS的设置等。这些家伙有多年的经验。
当然,另一个很好的资源是planet-mysql

m1m5dgzv

m1m5dgzv2#

我们使用这些设置:

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

xzlaal3s

xzlaal3s3#

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

table_definition_cache = 400

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

vom3gejh

vom3gejh4#

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

字符串
我会从那里开始,看看你是否能得到你想要的结果。有manyarticles关于调整MySQL内存设置。
编辑:
注意有些变量名为have changed in the newer 5.1.x releases of MySQL
举例来说:

table_cache


现在是:

table_open_cache

9bfwbjaz

9bfwbjaz5#

关于MYSQL是如何消耗内存的:https://dev.mysql.com/doc/refman/8.0/en/memory-use.html
/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内存的服务器上运行良好。

pb3s4cty

pb3s4cty6#

由于我没有足够的信誉点来支持以前的答案,我同意“table_definition_cache = 400”的答案在我的旧Centos服务器上工作。

k97glaaz

k97glaaz7#

如果你正在寻找优化你的docker mysql容器,那么下面的命令可能会有所帮助。我能够从默认的480 mb到仅仅100 mbs运行mysql docker容器。
docker run -d -p 3306:3306 -e MYSQL_DATABASE=test -e MYSQL_ROOT_PASSWORD=tooor -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

相关问题