2011-06-24 48 views
1

我正在面对我的服务器的高负载ichecked我所有的代码,所有这些都是好的,但我不知道它是(多列)代码。服务器负载问题

我用这一个

$getpics = mysql_query("select id,image_thumb from pics order by id desc limit 0,10"); 

while ($result = mysql_fetch_assoc($getpics)) {   
$data1[] = $result;   
}   
$data1 = array_chunk($data1, 5);   
echo '<table width="100%" border="0" cellpadding="5">'; 
foreach ($data1 as $row1) {   
echo '<tr>';   
foreach ($row1 as $column1) { 

echo ' 
<td align="center"> 
<div class="imagepic"> 
'.$column1[image_thumb].' 
</div> 
</td> 
'; 
}   
echo '</tr>'; 
}   
echo '</table>'; 

mysql_free_result($getpics); 

所以现在我confuced是在我的网站代码中对其进行负载。

问候

+0

那张桌子有多大?没有where子句,这可能相当于你在那里运行的巨大查询 – Dereleased

+0

他有限制 – genesis

+0

给我们一个'$ column1 [image_thumb]' – FinalForm

回答

1

而不是写出来的每一行,你可以缓冲输出。

$buf = "<table width="100%" border="0" cellpadding="5">"; 
foreach ($data1 as $row1) {   
$buf .= "<tr>";   
foreach ($row1 as $column1) { 
    $buf .= "<td align='center'>"; 
    $buf .= "<div class='imagepic'>"; 
    $buf .= $column1[image_thumb]; 
    $buf .= "</div></td>"; 
}   
$buf .= "</tr>"; 
}  
$buf .= "</table>"; 
echo $buf; 

嵌套for循环可能也没有帮助。通过名称或索引直接访问列可能会更快。

0

您可以缓冲输出,但PHP脚本不是这里的拦截器。 MySQL可能不应该是,因为你有一个限制集。

你可以在该查询上运行DESCRIBE SELECT并报告加载时间吗?其他页面上的加载效果不佳吗?

+0

ID - INT(11)无符号 用户标识 - INT(11) 图像 - VARCHAR(100) image_thumb - VARCHAR(100) SHORTURL - VARCHAR(100) CATID - VARCHAR(100) 名称 - VARCHAR(100) hits - varchar(100) active - varchar(100) –

+0

尝试运行:“解释选择id,image_thumb从图片顺序通过id desc limit 0,10”。抱歉,不是DESCRIBE。 –

+0

我做到了,我没有什么<表宽度= “100%” BORDER = “0” CELLPADDING = “5”>

1

我冒昧地做了一些更多的修改。我删除了其中一个循环,摆脱了array_chunk和其他一些循环。我真的没有看到太多的错误,所以这个问题很可能是其他问题,但让我知道。

$getpics = mysql_query("select id,image_thumb from pics order by id desc limit 0,10"); 

$out = '<table width="100%" border="0" cellpadding="5">'; // Use a string and concat 
$i = 0; 
while ($row = mysql_fetch_assoc($getpics)) { // No need to loop twice. Once is fine, 
    if(!($i%5))$out .= '<tr>'; 
    $out .= '<td align="center"> 
      <div class="imagepic"> 
      '.$row['id']. /*Do you REALLY want ID? That's what foreach will give you*/ ' 
      </div> 
     </td> 
     <td align="center"> 
      <div class="imagepic"> 
      '.$row['image_thumb'].' 
      </div> 
     </td>'; 
    $i++; 
    if(!($i%5))$out .= '</tr>'; // Inner loop removed. You're only selecting two columns! 
}  
if(($i%5))$out .= '</tr>'; // close the last row. 
echo $out.'</table>'; 

mysql_free_result($getpics); 

显然使用前检查错误。

0

这个php本身不会引起任何负载问题,除非你在这里显示的代码之外有什么大的事情发生。

通常您的查询是瓶颈,请尝试在您的查询上运行解释,例如。 EXPLAIN SELECT ...在像phpmyadmin这样的工具或通过mysql命令行,然后在这里发布输出。

尽管您的查询非常简单,并且由于您在订购ID(主键,自动增量,我假设)上,问题不太可能是mysql索引。

如果查询导致问题,请检查您的索引(可以在id上创建索引,image_thumb)请参阅http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html,或将memcached用作结果集的临时缓存引擎。

+0

ID \t SELECT_TYPE \t表\t \t型possible_keys \t \t键key_len \t \t参考行\t额外 1张\t \t SIMPLE图片\t \t索引NULL \t \t PRIMARY 4 \t NULL 使用索引 –

+0

我看,是一个非常简单的查询,你是否获得大量点击?你的服务器设置是什么? – Jason

+0

10.000之间我每天的访问者的15.000,总是我得到一个(core.6452)文件在我的FTP –