Answers:
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服务器(和-client)设置(在Ubuntu上),请参见我的要旨:http ://gist.github.com/637669
数据库的大小非常非常重要-信不信由你,Intarwebs上的大多数人从未处理过大型的,无法编写密集的MySQL设置,但确实存在。某些人会恶作剧并说出类似“使用PostgreSQL !!! 111”的字眼,但现在让我们忽略它们。
底线是:从大小上判断,将决定硬件。您无法真正使80 GB的数据库在1 GB的RAM上快速运行。
不是:更多,更好。仅需要设置索引,并且必须使用来检查其用法EXPLAIN
。另外,MySQL的EXPLAIN
功能确实有限,但这只是一个开始。
关于这些my-large.cnf
和my-medium.cnf
文件-我甚至不知道谁是那些书面。自己动手。
调优入门是一个很好的开始。这是一个bash脚本(提示:你需要的Linux),这需要的输出SHOW VARIABLES
和SHOW STATUS
和它包装成希望有用的建议。如果您的服务器已经运行了一段时间,则建议会更好,因为将有数据作为基础。
调音入门不是魔术酱。您仍然应该阅读所有建议更改的变量。
我真的很喜欢推荐mysqlperformanceblog。对于各种与MySQL相关的技巧,这是一个很好的资源。而且不仅是MySQL,他们还对正确的硬件有很多了解,或者为AWS建议安装等。这些人有多年的经验。
当然,另一个很棒的资源是planet-mysql。
tuning primer
,和它相比如何mysqltuner
?
我们使用以下设置:
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的内存设置在那里。
编辑:
请注意,在较新的MySQL 5.1.x版本中,某些变量名称已更改。
例如:
table_cache
就是现在:
table_open_cache
mysqld.exe在RAM中使用了480 mb。我发现我将此参数添加到my.ini中
table_definition_cache = 400
将内存使用量从400,000+ kb减少到105,000 kb
在/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
:)
如果您要优化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