我有一个显示赛马数据的页面。使用超过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秒,这是好的。但这可能需要一分钟......
答案 0 :(得分:0)
您有一些替代方案,您可以单独使用或累积使用。
使用缓存系统来减轻负担将是理想的,而且非常快。也不应该忘记混合系统。
使用(如已建议的)更好的索引来加速检索行。另外不要忘记添加全文索引。
使用分页脚本可以分割这个“大量数据”
但是没有任何示例代码,建议很少。
答案 1 :(得分:0)
正如我的意见 - 1.只需要加载。 2.大多数数据是图像 - 你可以压缩图像(简单的方法是在PHP端调整大小)。 3.压缩 - 并在客户端写入提取代码。 我经常,甚至没有登录就可以访问网站。隐藏那些您不希望暴露给整个世界的文件夹(即个人图像的文件夹),并使用一些技巧仅公开与用户相关的内容(安全问题)。 5.将您的数据库分散到多个域(甚至可以由同一个托管供应商实现)。 6.在客户端进行一些计算,在服务器端进行一些计算。明智地这样做。
祝你好运!答案 2 :(得分: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 ...
)。您可以使用它来查找瓶颈并识别缺失的索引,然后在添加索引后再次运行它,看看有什么不同。