关于RDS实例CPU超过100%的分析

  • 时间:
  • 浏览:0

C.Sorting result, Using filesort:出先你这个 清况 ,表示sql正在执行排序操作,排序操作就有引起较多的cpu消耗,通常的优化辦法 会加上适当的索引来消除排序,我希望缩小排序的结果集;

$result=mysql_query($sql,$conn);

$rnds=$rnds.$n.”. <a href=’show”.$row[‘id’].”-“.strtolower(trim($row[‘title’])).”‘>”.$row[‘title’].”</a><br />\n”;

3万条数据查12条随机记录,必须0.001秒,速率单位单位比第二种辦法 又提升了4倍左右,比第并就有辦法 提升120倍。注,这里使用了 order by field($idlist2) 是为了不排序,我希望 IN 是自动会排序的。缺点:有我希望遇到ID被删除的清况 ,全都必须多选有好多个ID。

while($row=mysql_fetch_array($result)){

3万条数据查12条随机记录,必须0.125秒,随着数据量的增大,速率单位单位那末低。

$sql=”select * from content where id in ($idlist) order by field($idlist2) LIMIT 0,12″;

$sql=”SELECT MAX(id),MIN(id) FROM content”;

总结:

用户实例zuowenwang反映cpu超过1150%,实例偶尔出先卡住的问题;

if($i==1){ $idlist=mt_rand($idmin,$idmax); }

$n=1;

$result=mysql_query($sql,$conn);

你这个 随机抽取一批记录的做法性能是很差的,表中的数据量越大,性能就越差:

$idmax=$yi[0];

$yi=mysql_fetch_array($result);

处置辦法 如下:

通过show processlist发现如下sql:

一个劲听见用户说一些人的rds实例cpu超过1150%,通常你这个 清况 就有我希望sql性能问题是因为的,下面我用一则案例来分析:

$sql=”SELECT * FROM content ORDER BY rand() LIMIT 12″;

1.原理:cpu消耗过大通常清况 下就有有慢sql造成的,这里的慢sql包括全表扫描,扫描数据量过大,内存排序,磁盘排序,锁争用守候等;

$rnds=$rnds.$n.”. <a href=’show”.$row[‘id’].”-“.strtolower(trim($row[‘title’])).”‘>”.$row[‘title’].”</a><br />\n”;

Sql A.

B.Copying to tmp table on disk:出先你这个 清况 ,通常清况 下是我希望临时结果集很多,超过了数据库规定的临时内存大小,必须拷贝临时结果集到磁盘上,你这个 事先必须用户对sql进行优化;

$rnds=”;

$n=1;

$rnds = $rnds.$n.”. <a href=’show”.$yi[‘id’].”-“.strtolower(trim($yi[‘title’])).”‘>”.$yi[‘title’].”</a><br />\n”;

WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 1″;

3万条数据查12条随机记录,必须0.004秒,速率单位单位大幅提升,比第并就有方案提升了约150倍。缺点:多次select查询,IO开销大。

加上适当索引消除排序:

第并就有方案,即原始的 Order By Rand() 辦法 :

$idmin=$yi[1];

http://www.piaoyi.org/php/MySQL-Order-By-Rand.html

你这个 sql是典型的sql分页写法不规范的清况 ,必须将sql进行改写:

3.处置辦法 :用户上有助登录到rds,通过show processlist查看当前正在执行的sql,当执行完show processlist后出先多量的句子,通常其清况 出先sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result, Using filesort 就有sql有性能问题;

$result=mysql_query($sql,$conn);

$yi=mysql_fetch_array($result);

}

第并就有方案,SQL句子先随机好ID序列,用 IN 查询(飘易推荐你这个 用法,IO开销小,速率单位单位最快):

性能sql:

第二种方案,改进后的 JOIN 辦法 :

for($i=1;$i<=20;$i++){

A.sending data表示:sql正在从表中查询数据,我希望查询条件那末适当的索引,则会是因为sql执行时间过长;

for($n=1;$n<=12;$n++){

2.表现问题sql执行清况 为:sending data,Copying to tmp table,Copying to tmp table on disk,Sorting result,locked;

$result=mysql_query($sql,$conn);

$rnds=”;

C.出先sending data的清况 :

Sql B:

$n++;

$idlist=”;

SELECT * FROM `www_article` WHERE CONCAT(subject,description) like ‘%??%’ ORDER BY aid desc LIMIT 75,15

性能sql:

优化后的结果:

用explain 查看执行计划:

}

RDS-mysql我希望有资源的隔离,不同的实例规格拥有的iops能力不同,比如新1型提供的iops为1150个,也我希望每秒有助提供1150次的随机磁盘io操作,全都我希望用户的数据量很大,内存很小,我希望iops的限制,第一根慢sql就很有我希望消耗掉所有的io资源,而影响一些的sql查询,对于数据库来说我希望所有的sql必须执行很长的时间有助返回结果,对于应用来说就会造成整体响应的变快;全都优化永不止境,既上有助帮助你的系统稳定,一起去又上有助节约你的成本,何乐不为。

注意这里的索引必须改用覆盖索引:aid+ subject+description

Sql优化是性能优化的最后一步,真是 趋于稳定塔顶,他最直影响用户的使用,但也是最容易优化的步骤,往往效果最直接。

}

$n++;

你这个 sql order by rand()同样也会出先排序;

else{ $idlist=$idlist.’,’.mt_rand($idmin,$idmax); }

while($row=mysql_fetch_array($result)){

$sql=”SELECT * FROM `content` AS t1

JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `content`)) AS id) AS t2

$idlist2=”id,”.$idlist;

}