-2

我有一个显示赛马数据的页面。拥有超过 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

4

3 回答 3

0

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

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

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

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

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

于 2013-09-10T19:53:06.293 回答
0

我认为 - 1. 只需要加载。2. 大部分数据是图像 - 你可以压缩图像(简单的方法是在 php 端调整它的大小)。3. 压缩 - 并在客户端编写提取代码。4.我认为,即使没有登录也可以访问该站点。隐藏那些您不想向全世界公开的文件夹(即个人图像的文件夹),并使用一些技巧仅公开与用户相关的内容(安全问题)。5. 将您的数据库传播到多个域(即使是同一托管供应商也可以实现这一点)。6. 一些计算放在客户端,一些放在服务器端。明智地这样做。

祝你好运!

于 2013-09-10T19:53:34.680 回答
0

您可能缺少一些索引。每当您按一列或一组列进行搜索时,都应在这些列上创建索引以加快搜索过程。通过这样做,您可以从字面上将查询的执行时间从几分钟减少到几分之一秒。因此,例如,如果您经常results根据 和 列tracklocation搜索表date,则可以运行此查询来创建索引以加快该过程:

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

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

于 2013-09-10T20:00:24.637 回答