php mysql改善了加载时间

时间:2013-09-10 19:42:02

标签: php mysql ajax performance

我有一个显示赛马数据的页面。使用超过GB的数据库。

根据显示的数据量,页面最多可能需要1分钟才能完全显示。

如果我删除一行我有大量计算和mysql查询的速度会更快,但这会影响我的最终用户。

您的建议是加快页面加载速度吗?

我最后的想法是在没有繁重计算的情况下显示页面,然后进行AJAX调用(用户单击一个按钮)来计算数据并显示它。

还有其他想法吗?

这是代码 - 我估计 - 造成缓慢:

function stallWin($stall,$course,$distance,$runners){
  include ("dbstring.php");

  $threeless = $runners - 3;
  $threemore = $runners + 3;

  $hsql = "select course, runners, distance, date from ".$table."horse where course = '".$course."' and runners >= '".$threeless."' and runners <= '".$threemore."' and distance = '".$distance."' and xposition = '1' and draw > 0 and draw <='$runners'";
  $hresult = mysql_query($hsql,$db);

  $htotalraces = mysql_num_rows($hresult);

  $hsql = "select draw, sum(IF(xposition=1,1,0)) as wins from ".$table."horse where course = '".$course."' and runners >= '".$threeless."' and runners <= '".$threemore."' and distance = '".$distance."' and draw = '$stall'";

  $hbox = '';
  $hresult = mysql_query($hsql,$db);
  $totalrut = 0;
  while ($hmyrow = mysql_fetch_array($hresult)){
    $hpercent = number_format( (($hmyrow['wins'] / $htotalraces ) * 100),0);
    $hbox.='<tr><td style="text-align:center;" class="likbox">'.$hmyrow['draw'].'</td><td style="text-align:center;" class="likbox">'.$hmyrow['wins'].'</td><td style="text-align:center;" class="likbox">'.$hpercent.'</tr>';
    $totalrut = $totalrut + $hmyrow['wins'];
  }   
      return $hpercent; 
} 

每个种族的每匹马都会调用此功能。如果页面显示10场比赛,每场10匹马,我会称之为100次。

我无法在这里添加图片,因为我没有足够的声誉。

解释截图(1):http://screencast.com/t/6RlOLtnQKs 解释截图(2):与之前的结尾相同的网址:/ qCvBt8Hst(发布超过2个链接的声誉不够)

我也尝试过使用PHP分析器,但我遇到了SQL日志问题。在该示例中,页面显示需要16秒,这是好的。但这可能需要一分钟......

http://screencast.com/t/mp86eA1Y

3 个答案:

答案 0 :(得分:0)

您有一些替代方案,您可以单独使用或累积使用。

使用缓存系统来减轻负担将是理想的,而且非常快。也不应该忘记混合系统。

使用(如已建议的)更好的索引来加速检索行。另外不要忘记添加全文索引。

使用分页脚本可以分割这个“大量数据”

但是没有任何示例代码,建议很少。

答案 1 :(得分:0)

正如我的意见 - 1.只需要加载。 2.大多数数据是图像 - 你可以压缩图像(简单的方法是在PHP端调整大小)。 3.压缩 - 并在客户端写入提取代码。 我经常,甚至没有登录就可以访问网站。隐藏那些您不希望暴露给整个世界的文件夹(即个人图像的文件夹),并使用一些技巧仅公开与用户相关的内容(安全问题)。 5.将您的数据库分散到多个域(甚至可以由同一个托管供应商实现)。 6.在客户端进行一些计算,在服务器端进行一些计算。明智地这样做。

祝你好运!

答案 2 :(得分:0)

你可能错过了一些索引。无论何时按列或一组列进行搜索,都应在这些列上创建索引以加快搜索过程。通过执行此操作,您可以将查询的执行时间从几分钟减少到几分之一秒。因此,例如,如果您经常根据列resultstracklocation搜索表date,则可以运行此查询来创建索引以加快进程:

#                                Name of index            Columns being indexed
ALTER TABLE `results` ADD INDEX `results_location_date` (`tracklocation`, `date`)

MySQL有一个名为EXPLAIN的命令,它会显示有关您要运行的查询的信息:有多少列,要查看的行数等等。只需插入单词'即可运行它在查询之前解释(即explain select * from ...)。您可以使用它来查找瓶颈并识别缺失的索引,然后在添加索引后再次运行它,看看有什么不同。