mysql sql cpu占用高查询解决

当MySQL的SQL查询CPU占用率较高时,可以通过以下步骤排查: 查找问题:Linux下Top; htop 使用vmstat等工具(如top、htop、vmstat等)检查MySQL进程的CPU使用率,以确定CPU使用率是否异常高。
使用MySQL自带的性能监控工具,如SHOWPROCESSLIST,查看当前正在执行的SQL语句,查找执行时间较长或占用资源较多的查询。
这些查询可能是导致 CPU 使用率过高的原因。
检查慢查询日志记录:确保启用慢查询日志记录,并为记录超过执行时间阈值的 SQL 语句设置合理的阈值。
分析慢查询日志可以识别可能导致 CPU 峰值的慢查询。
这些问题通常是复杂的子问题;包括全表扫描等低效操作。
优化SQL查询:慢查询语句如将子查询转换为连接查询,降低查询复杂度让它变得更好。
根据查询条件添加索引,经常对字段进行过滤和分组,提高查询效率。
但要注意避免创建过多的索引,以免增加写操作成本。
调整MySQL配置参数:适当增大innodb_buffer_pool_size参数值,以减少磁盘I/O操作,降低CPU占用率。
MySQL版本是否支持线程池;可以调整thread_pool_size等相关参数如thread_pool_size;优化线程管理,减少CPU浪费。
使用数据库自​​治服务:如果情况允许;您可以使用阿里云DAS等数据库自治服务,通过其提供的SQL诊断功能来解决异常SQL语句。
根据自主服务提供的优化建议;优化非常规SQL语句,降低实例CPU占用率。
以上步骤将有效解决MySQL SQL查询导致的CPU占用率高的问题。

MySQL CPU占用过高怎么办

凭借之前运行mysql的经验,我首先排除了mysql的配置问题,并通过用记事本查看mysqldata目录下的*.err文件(将扩展名改为.txt)来检查msyql是否正常运行。
如果太大,不建议使用记事本,因为它很容易死掉。
您可以使用 Editplus 等工具。
解决这个问题只要分解为以下几个步骤: 1 、MySQL工作正常,或者可能是同步设置的问题。
2 .如果mysql工作正常,则可能是PHP中的某些SQL语句导致了问题。
使用root用户进入mysql管理mysql-uroot-p并输入密码mysql:showprocesslist语句查找负载最大的SQL语句并对SQL进行优化,比如适当为特定字段创建索引。
通过这件事,我看到有人在恶意寻找他。
由于dedecms搜索后面是搜索次数最多的单词,因此许多人使用工具来搜索它,并且这是定期进行的,因此重命名PHP脚本并转移到它解决了问题。
当然,如果你的SQL语句使用了大量的聚合语句等数据,联合查询等肯定会增加单元格占用率。
因此,有必要优化SQL语句,尽量创建一个稳定的网站。
一般来说,对于4 Wip的静态网站来说,mysql的占用率大约为0。
所以这是对程序员体验的考虑。
尝试优化MySQL性能(2 0余条优化MySQL性能最佳分享经验)。
以下为豆芽收录的文章。
可以参考MYSQLCPU 1 00%占用现象的描述。
早上帮朋友解决了服务器Mysqlcpu占用1 00%的问题。
稍微整理了一下,我将我的经验记录在这篇文章中。
最近朋友的主机(Windows2 003 +IIS+PHP+MYSQL)上MySQL服务进程(mysqld-nt.exe)的CPU使用率一直是1 00%。
该主机包含大约1 0个数据库,连续被1 0个站点调用。
据朋友测试,mysqld-nt.execpu使用率很高的原因是A网站,一旦在IIS中停止该网站,CPU使用率就会下降。
一旦激活,它就会立即上升。
今天早上仔细检查了一下MYSQLCPU使用率1 00%的解决过程。
目前,该网站7 天日均IP地址为2 000个,浏览量约为3 万次。
A网站使用的数据库目前有3 9 张表,6 01 000条录制,占用4 5 MB空间。
根据这个数据来看,MySQL不可能占用如此大量的资源。
于是在服务器上运行命令,将mysql当前的环境变量输出到input.txt文件中:d:\web\mysql>mysqld.exe--help>output.txt,发现tmp_table_size的值为默认值3 2 M,所以办法是修改My.ini,将tmp_table_size设置为2 00M:d:\web\mysql>notepadc:\windows\my.ini[mysqld]tmp_table_size=2 00M 然后重启MySQL服务。
CPU 使用率略有下降。
以前的CPU使用率波形是1 00%的直线,但现在它在9 7 %到1 00%之间波动。
由此可见,调整tmp_table_size参数可以提高MYSQL的性能。
但问题还没有完全解决。
于是我进入了mysql的shell命令行,名为showprocesslist,查看了mysql中常用的SQL语句:mysql>showprocesslist;我反复调用这个命令,发现A网站的SQL语句经常在处理中。
它出现在 st 中,语法如下: SELECTt1 .pid,t2 .userid,t3 .count,t1 .dateFROM_mydataASt1 LEFTJOIN_myuserASt3 ONt1 .userid=t3 .useridLEFTJOI N_mydata_bodyASt2 ONt1 .pid=t3 .pidORDERBYt1 .pidLIMIT0,1 5 调用显示列来检查这三个表的结构: mysql>showcolumnsfrom_myuser;mysql>s howcolumnsfrom_mydata;mysql>showcolumnsfrom_mydata_body;最后发现了问题:_mydata表只根据产品ID创建了主键,而没有在用户ID上创建索引。
在此 SQL 语句的第一个 LEFTJOINON 子句中: LEFTJOIN_myuserASt3 ONt1 .userid=t3 .userid_mydata 的用户 ID 包含在条件比较操作中。
所以我根据字段用户ID为_mydata表创建了一个索引:mysql>ALTERTABLE`_mydata`ADDINDEX(`userid`)。
创建这个索引后,CPU立即下降到8 0%左右。
看到问题找到了,我检查了showprocesslist中重复出现的另一条SQL语句: SELECTCOUNT(*)FROM_mydataASt1 ,_mydata_keyASt2 WHEREt1 .pid=t2 .pidandt2 .keywords='Peacock' 检查_mydata_key表的结构后,发现它只为pid创建了主键,并没有为关键字创建索引。
_mydata_key当前包含3 3 0,000条记录,3 3 0,000条记录没有索引奇怪的是,文本搜索和匹配记录并不会消耗太多的 CPU 时间。
检索此表时似乎出现问题。
所以我们还根据字段关键字为_mydata_key表添加了索引:mysql>ALTERTABLE`_mydata_key`ADDINDEX(`keywords`)。
创建这个索引后,CPU立即下降,在5 0%到7 0%之间波动。
再次调用showprosslist,A网站的SQL调用很少出现在结果列表中。
然而,事实证明该主机正在运行多个Discuz论坛程序,并且Discuz论坛中的多个表也遇到了此问题。
于是我们一下子就把问题解决了,CPU占用率又下降了。
(2 007 .07 .09 注:关于Discuz论坛的具体优化过程,我后来又写了一篇文章,详细参见:Discuz论坛优化笔记!千万条记录导致MySQLCPU 1 00%占用) 经验总结 通过增大tmp_table_size的值解决MYSQLCPU占用1 00%的问题。
在mysql配置文件中,tmp_table_size默认大小为3 2 M。
如果临时表超过此大小,MySQL 将生成 Thetabletbl_nameisfull 形式的错误。
如果运行许多高级 GROUPBY 查询,请增加 tmp_table_size 值。
对于 WHERE、JOIN、MAX()、MIN()、ORDERBY 等子句中条件语句中使用的字段,必须基于它们创建 INDEX。
索引用于快速查找列中具有特定值的行。
如果没有索引,MySQL 必须从第一条记录开始,然后读取整个表,直到找到相关行。
表越大,花费的时间就越多。
如果表在查询列上有索引,MySQL 可以快速到达在数据文件中间进行搜索的位置,而无需查看所有数据。
如果表有 1 000 行,这至少比顺序读取快 1 00 倍。
所有 MySQL 索引(PRIMARY、UNIQUE、INDEX)都存储在 B 树中。
根据 MySQL 开发文档: Index 索引用于:快速查找与 WHERE 子句匹配的行,并在执行联接(JOIN)时从其他表中检索行。
查找指定索引列的 MAX() 或 MIN() 值。
如果对可用键的最左侧前缀执行排序或分组(例如 ORDERBYkey_part_1 、key_part_2 ),则对表进行排序或分组。
如果所有关键部分都遵循 DESC,则将以相反的顺序读取按键。
在某些情况下,可以优化查询以检索值,而无需查阅数据文件。
如果某些表使用的所有列都是数字,并形成某些键的最左边前缀,则可以从索引树中检索值以获得更快的性能。
假设您发出以下 SELECT 语句: mysql>SELECT*FROMtbl_nameWHEREcol1 =val1 ANDcol2 =val2 ;如果第1 列和第2 列上有多列索引,则可以直接获取相应的行。
如果第 1 列和第 2 列有单独的单列索引,优化器会尝试通过选择可找到较少行的索引并使用该索引获取行来查找限制最严格的索引。