最近我的服务器CPU一直很高.

CPU负载平均为13.91(1分钟)、11.72(5分钟)和8.01(15分钟),而我的网站的流量只略有增加.

运行top命令后,我看到MySQL使用了160%的CPU!

最近,我一直在优化表,并切换到持久连接.这会导致MySQL使用大量CPU吗?

推荐答案

首先,我想说的是,你可能想关闭持久性连接,因为它们几乎总是弊大于利.

第二,我想说的是,你要仔细判断你的MySQL用户,以确保任何人都不可能从远程服务器连接.这也是一个需要判断的重要安全问题.

第三,我想说的是,您希望打开MySQL Slow Query日志(log)来监视任何需要很长时间的查询,并使用它来确保没有任何查询将密钥表锁定太久.

您可以判断的其他事项是在CPU负载较高时运行以下查询:

SHOW PROCESSLIST;

这将向您显示当前正在运行或要运行的队列中的任何查询、查询内容及其执行的操作(如果查询太长,此命令将截断查询,您可以使用show FULL PROCESSLIST查看完整的查询文本).

您还需要关注缓冲区大小table cachequery cacheinnodb_buffer_pool_size(如果您使用的是innodb表),因为所有这些内存分配都会影响查询性能,从而导致MySQL耗尽CPU.

你可能还想仔细阅读以下内容,因为它们包含一些好信息.

使用分析器也是一个非常好的主意.你可以在需要的时候打开它,它会告诉你你的应用程序正在运行什么查询,如果有重复的查询,它们需要多长时间,等等.我一直在研究的一个例子叫做PHP Profiler,但有很多.如果你正在使用Drupal、Joomla或Wordpress等软件,你会想在社区内四处询问,因为他们可能有一些模块可以让你获得这些信息,而不需要手动集成任何东西.

Mysql相关问答推荐

MySQL嵌套的内连接使查询变得很慢-解决方案?

DJANGO 使用原始 MYSQL 查询计算记录数并在 html 模板中使用结果

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

使用不同的 where 列进行子 Select

使用 awk 重写 maxscale 过滤器

多列分组并进行求和

Mysql根据文本语言或行数将列拆分为多列

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

Next-key lock explication - 范围的主键

为什么order by子句可以利用索引?

为什么一个 10 位的电话号码不能存储在长度为 10 的整数中?

MySQL如何通过外键ID Select 多行?

SUBSTRING_INDEX 获取第 n 个值

我将如何构建一个 SQL 查询来从交易表中 Select 第一次存款、第二次存款和额外存款

使用带有 ELSEIF 和 ELSE 的 3 列更新问题

MySQL:将日期时间插入其他日期时间字段

让 MySQL 在 OSX 10.7 Lion 上运行

MySQL计算特定值的列

如何从 MySQL Workbench 中的图表生成 SQL 脚本?

使用 MySql,我可以对列进行排序但最后有 0 吗?