我的MySQL服务器物理内存不足,开始使用swap。如何判断使用最多内存的是什么?理想情况下,它将是一个特定的表或一组索引,我只能优化少量项目。
我的数据库超过100GB,我当前的机器有15GB内存。
感谢。
答案 0 :(得分:4)
MySQL的最大内存使用量在很大程度上取决于硬件,你的 设置和数据库本身。
硬件
硬件是显而易见的部分。 RAM越多越快 磁盘 ftw 。不要相信那些每月或每周的新闻信件 虽然。 MySQL不会线性扩展 - 甚至不能在Oracle硬件上扩展。它的 比这更棘手。
底线是:对于什么是没有一般经验法则 推荐用于你的 MySQL设置。这一切都取决于当前 用法或预测。
设置&数据库
MySQL提供无数变量和开关来优化它 行为。如果遇到问题,你真的需要坐下来阅读 (f)手册。
至于数据库 - 一些重要的限制因素:
- 表引擎(
InnoDB
,MyISAM
,...)* size * indices * usage关于stackoverflow的大多数MySQL技巧都会告诉你5-8所谓的 重要的设置。首先,并非所有这些都很重要 - 例如 为InnoDB分配大量资源而不使用InnoDB则没有 很有意义,因为这些资源都被浪费了。
或者 - 很多人建议提升
max_connection
变量 - 好吧,他们几乎不知道这也意味着MySQL会分配 如果需要,可以提供更多资源来满足max_connections
的需求。该 更明显的解决方案可能是关闭数据库连接 您的DBAL或降低wait_timeout
以释放这些线程。如果你抓住了我的漂移 - 那里真的很多,很多东西要读 学习。
发动机
表引擎是一个非常重要的决定,很多人都忘记了 关于那些早期然后突然发现自己与一个人打架 30 GB大小
MyISAM
表,锁定并阻止其整个 应用我不是说 MyISAM很糟糕,但
InnoDB
可以调整为 响应几乎或几乎与MyISAM
一样快,并提供诸如此类的东西UPDATE
上的行锁定,而MyISAM
锁定整个表时 它被写入。如果您可以自由在自己的基础架构上运行MySQL,那么 可能还想查看percona server,因为其中 包括Facebook和Facebook等公司的大量贡献 谷歌(他们知道速度很快),它还包括Percona自己的插手 替换
InnoDB
,名为XtraDB
。请参阅我的要点,了解percona-server(和-client)设置(在Ubuntu上): http://gist.github.com/637669
尺寸
数据库大小非常非常重要 - 信不信由你 Intarwebs上的人从未处理过大而且写得很激烈 MySQL设置,但那些确实存在。有些人会喋喋不休地说 像“使用PostgreSQL !!! 111”之类的东西,但我们暂时忽略它们。
底线是:从大小来判断,决定硬件 要做。你不能真正让1 GB的80 GB数据库快速运行 GB的RAM。
指数
不是:越多越好。只需要设置所需的索引 必须使用
EXPLAIN
检查使用情况。再加上那个MySQL的EXPLAIN
真的有限,但这是一个开始。建议的配置
关于这些
my-large.cnf
和my-medium.cnf
文件 - 我甚至都没有 知道是谁写的。滚动你自己。调谐引物
一个很好的开始是tuning primer。这是一个bash脚本(提示: 你需要linux),它取
SHOW VARIABLES
和{}的输出SHOW STATUS
并将其包含在希望有用的建议中。如果 你的服务器运行了一段时间后,建议会更好 将有数据基于它们。虽然调音底漆不是神奇的酱汁。你还是应该读 它建议改变所有变量。
读
我真的很想推荐mysqlperformanceblog。这太好了 各种MySQL相关技巧的资源。它不只是MySQL, 他们也知道很多关于正确的硬件或推荐设置 AWS等。这些人有多年的经验。
当然,另一个很棒的资源是planet-mysql。
关于Mysql内存使用情况的stackoverflow上的类似问题引用了这个答案:MySQL maximum memory usage
希望这有帮助。
答案 1 :(得分:0)
查看SHOW FULL PROCESSLIST
查询的结果,或启用slow query log来查明较慢的查询。