我们正在运行一个网站(Moodle),用户目前发现它很慢。我想我已经将问题追溯到 MySQL 在磁盘上创建临时表。我created_tmp_disk_tables在 Mysql Workbench 服务器管理中观察了这个变量,这个数字以大约 50 个表/秒的速度增加。经过一天的使用,created_tmp_disk_tables是> 100k。此外,内存似乎没有被释放。使用量不断增加,直到系统变得几乎无法使用,我们必须重新启动 MySQL。我几乎每天都需要重新启动它,从使用大约 30-35% 的可用内存开始,并以 80% 结束一天。
我在数据库中没有 blob,也无法控制查询,因此我无法尝试优化它们。我还使用了Percona 配置向导来生成配置文件,但是 my.ini 也没有解决我的问题。
我应该更改什么来阻止 MySQL 在磁盘上创建临时表?我需要更改哪些设置?我应该给它扔更多的内存吗?
如何阻止 MySQL 占用我的内存?
我启用了slow_queries日志并发现查询SELECT GET_LOCK() 被记录为缓慢。快速搜索显示我在 PHP 配置 ( mysqli.allow_persistent = ON) 中允许持久连接。我关掉了这个。这降低了 MySQL 消耗内存的速度。它仍然在创建临时表。
我还检查了它key_buffer size是否足够大。我看着变量key_writes。这应该为零。如果没有,请增加key_buffer_size.I 有零key_reads和零,key_writes因此我认为key_buffer_size足够大。
我将tmp_table_size和max-heap-table-size增加到 1024M,因为 created_tmp_disk_tables 的增加可能表明这些表无法放入内存。这并没有解决它。
参考:http : //www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-temporary-tables/
如果您sort_merge_passes …
我有两张桌子 -comments和votes:
comments(id, text, user_id, page_id)
votes(id, value)
Run Code Online (Sandbox Code Playgroud)
表中有 2,000,000 行votes。
我创建了以下查询:
SELECT SUM(votes.value),
comments.text,
comments.comment_id
FROM comments, votes
WHERE comments.comment_id = votes.comment_id AND comments.page_id = $page_id
GROUP BY comment_id;
Run Code Online (Sandbox Code Playgroud)
查询运行了大约 12 秒,这正常吗?
SHOW PROCESSLIST说它复制到临时表。这看起来很慢,是否需要使用临时表?
我有一个 Web 应用程序连接到运行 MySQL 的数据库。
问题在于:大量查询创建了临时表,并且涉及的许多表都具有 BLOB 字段。这意味着我在磁盘上创建了很多临时表(这里描述了这种行为https://dba.stackexchange.com/a/17679/16724),这会导致非常糟糕的性能。
有没有办法轻松解决这个问题?也许一些叉子或其他可插拔引擎?我实际上正在运行 MySQL (XtraDB) 的 Percona fork,但它与 vanilla InnoDB 存在相同的问题。坦率地说,我正在考虑改用 Postgres。
谢谢