2013-10-27 35 views
0

我写了一个web应用程序(我的第一个),它现在运行得非常慢,某些ajax'$ post's需要长达40秒。mysql数据库运行速度非常慢

我无法提供整个站点的代码,因为它占用了太多的空间。我需要重新考虑它,以便运行更快。

当网站加载它时,大约7次同时调用7个脚本,所有这些脚本都从mysql数据库中检索数据。

Q1你可以在php中创建数据库队列(如obj-c中的fmdatabase.queue)?所以,有一个连接到数据库和呼叫发生一个其他

后的数据库中有大约100万个(其中有人告诉我不应该导致性能问题)。我从阅读中使用mysql而不是mysqli,我已经完成了,但是我不会看到从更改为mysqli的速度提高。这是正确的吗?

这里是我的数据库中创建脚本:

$TripsData = " 
    CREATE TABLE IF NOT EXISTS trips_data (
     id INT(10) NOT NULL AUTO_INCREMENT, 
     userid INT(10), 
     tripid INT, 
     gmttimestamp BIGINT, 
     latitude DOUBLE(24,20), 
     longitude DOUBLE(24,20), 
     altitude DOUBLE(24,20), 
     accuracy DOUBLE(24,20), 
     speed DOUBLE(24,20), 
     species INT, 
     killcount INT, 
     PRIMARY KEY (id) 
    ) TYPE =MYISAM 
"; 

这里是我的一个脚本,用于获取用户数据

<?php 
include ('header.php'); 
$userid=isloggedin(); 
if(isset($_POST['tripid'])){ 
$tripid=$_POST['tripid']; 
$tripidbool=true; 
}else{ 
    $tripidbool=false; 
} 
    if(isset($_POST['gamebook'])){$gamebookbool=true;}else{$gamebookbool=false;} 
    if(isset($_POST['bounds'])){$bounds=$_POST['bounds'];$boundsboo=true;   }else{$boundsboo=false;} 

if($tripidbool&&!$boundsboo){ 

    $totaldistanceinm=getTotalDistanceInM($userid, $tripid);   
echo '<tr><td> Distance Traveled </td><td> '.number_format(($totaldistanceinm/1000),2).' Km ('.number_format(($totaldistanceinm/1000)*(0.62137),2).' miles)</td></tr>'; 

    $query="SELECT MIN(gmttimestamp), 
     MAX(gmttimestamp), 
     AVG(speed), 
     SUM(killcount) 
     from trips_data WHERE tripid=$tripid AND userid=$userid"; 
    $result=mysql_query($query)or die(' '.mysql_error()); 
    $row=mysql_fetch_array($result); 


echo'<tr><td>Start Time </td><td> '. date('H:i',$row[0]).'</td></tr>'; 

echo '<tr><td>Finish Time </td><td> '. date('H:i',$row[1]).'</td></tr>'; 

    $dur= $row[1]-$row[0]; 
    if($dur!==0) 
    { 
     $hrs=($dur-($dur%3600))/3600; 
     $mins=((($dur%3600)-($dur%60))/60); 
     echo '<tr><td>Duration</td><td>'.$hrs.' Hours '.$mins.' Mins </td></tr> '; 
    } 

$totalk= $row[3]; 
echo '<tr><td>Total Kills</td><td>'.$totalk .'</td></tr>'; 
if($dur!==0) 
    { 
     echo '<tr><td>Kills/Hour</td><td>'.number_format(($totalk*3600/$dur),2).'</td></tr>'; 
    } 

$total=$row[2]; 
echo '<tr><td>Avg Speed m/s</td><td>'.number_format($total,2).'</td></tr>'; 

    $query="SELECT SUM(gmttimestamp) FROM trips_data WHERE userid=$userid AND tripid=$tripid AND speed>0"; 
$res=mysql_query($query) or die(' '.mysql_error()); 
$row=mysql_fetch_array($res); 
    $timeMoving=$row[0]; 

    $query="SELECT SUM(gmttimestamp) FROM trips_data WHERE userid=$userid AND tripid=$tripid AND speed=0"; 
$res=mysql_query($query) or die(' '.mysql_error()); 
$row=mysql_fetch_array($res); 
    $timeNotMoving=$row[0]; 

    $toatltime=$timeMoving+$timeNotMoving; 

    echo '<tr><td>%Time Moving/Stationary</td><td>'.number_format(($timeMoving/$toatltime)*100,2).'/'.number_format(($timeNotMoving/$toatltime)*100,2).'</td></tr>'; 
    // SELECT sum(trips_data.killcount), trips_data.species,masterspecies.species from trips_data join masterspecies WHERE tripid=335 AND userid=1 AND NOT killcount=0 

$query="SELECT sum(trips_data.killcount) as kills, 
     trips_data.species as species_id, 
     masterspecies.species 
      FROM trips_data 
      JOIN masterspecies ON masterspecies.speciesidno = trips_data.species 
      WHERE tripid =$tripid 
      AND userid =$userid 
      AND NOT killcount =0 
      GROUP BY trips_data.species 
      LIMIT 0 , 30"; 
$res=mysql_query($query)or die('87'.mysql_error()); 

while ($row=mysql_fetch_assoc($res)) 
    { 
    $species=$row['species_id']; 
    $SpeciesName=""; 

    if($species<0){ 
     $species*=-1; 
     $SpeciesName="Seen "; 

    } 
    $SpeciesName.=$row['species']; 
    $totalkills=$row['kills']; 

    echo '<tr><td>Total '.$SpeciesName.'s</td><td> '.$totalkills.' </td></tr>'; 
} 

} 
elseif ($boundsboo&&!$tripidbool){ 
    $minlat=$_POST['minlat']; 
    $maxlat=$_POST['maxlat']; 
    $minlong=$_POST['minlon']; 
    $maxlong=$_POST['maxlon']; 

    $latlon=getCenterPointForBox($minlat, $minlong, $maxlat, $maxlong); 
    $farmerId= getFarmerIdForCenterPoint($latlon[0], $latlon[1]); 

    if($farmerId) 
    { 
     $where=getWhereClauseForFarmersBoundaries(getBoundaryBoxesForFarmer($farmerId)); 
     $query="SELECT DISTINCT tripid FROM trips_data WHERE (".$where .") AND userid=$userid order by gmttimestamp desc"; 

    } else { 
     $query="SELECT DISTINCT tripid FROM trips_data WHERE userid=$userid 
     AND latitude BETWEEN $minlat AND $maxlat 
     AND longitude BETWEEN $minlong AND $maxlong "; 
    } 


$res=mysql_query($query) or die(' '.$query.' '.mysql_error()); 
$totaldistanceinm=0; 
    $number=mysql_num_rows($res); 

    $dur=0; 
for($a=0;$a<$number;$a++){ 
    $row=mysql_fetch_array($res); 
    $ctripid=$row[0]; 

    $longprev=0; 
    $latprev=0; 
    $longdegstometers=10000000/90; 
    $latdestom=0; 


    $query_1="SELECT gmttimestamp,latitude, longitude FROM trips_data WHERE tripid=$ctripid AND userid=$userid ORDER BY gmttimestamp"; 
    $resa=mysql_query($query_1)or die(' '.mysql_error().$query_1); 
    for($i=0;$i<mysql_num_rows($resa);$i++){ 
     $rowa=mysql_fetch_assoc($resa); 
     $long=$rowa['longitude']; 
     $lat=$rowa['latitude']; 
     if($i==0){ 
          $st=$rowa['gmttimestamp']; 
      $longprev=$long; 
      $latprev=$lat; 
      $latdestom=cos($long)*$longdegstometers; 
     } 
     if($i>=1){ 
      $dlongM=($longprev-$long)*$longdegstometers; 
      $dlatM=($latprev-$lat)*$latdestom; 
      $distance=sqrt(($dlatM*$dlatM)+($dlongM*$dlongM)); 
      $totaldistanceinm+=$distance; 
      $longprev=$long; 
      $latprev=$lat; 
          $et=$rowa['gmttimestamp']; 
     } 

    } 
      $dur+=($et-$st); 


    } 

echo '<tr><td>Total Distance Traveled </td><td> '.number_format(($totaldistanceinm/1000),2). 
' Km ('.number_format(($totaldistanceinm/1000)*(0.62137),2).' miles)</td></tr>'; 
$hrs=($dur-($dur%3600))/3600; 
$mins=((($dur%3600)-($dur%60))/60); 
echo '<tr><td>Total Contact</td><td>'.$hrs.' Hours '.$mins.' Mins </td></tr> '; 
echo '<tr><td>Total Number of Trips</td><td>'.$number.' </td></tr> '; 

if(!$where)$where=" latitude BETWEEN $minlat AND $maxlat 
     AND longitude BETWEEN $minlong AND $maxlong "; 
$query="SELECT DISTINCT species FROM trips_data WHERE userid=$userid AND killcount>0 AND ".$where ." "; 
$re_sp= mysql_query($query) or die(''. mysql_error()); 
    for($i=0;$i< mysql_num_rows($re_sp);$i++) 
    { 

    $row= mysql_fetch_array($re_sp); 
    $species=$row[0]; 
      if($species==0){continue;} 
    $SpeciesName=""; 

      $iiquery="SELECT SUM(killcount) FROM trips_data WHERE userid=$userid 
     AND species=$species AND (".$where.") "; 

    $iires=mysql_query($iiquery) or die('196 '.mysql_error()); 
    $iirow=mysql_fetch_array($iires); 
    $totalkills=$iirow[0]; 

    if($species<0){ 
     $species*=-1; 
     $SpeciesName="Seen "; 

    } 

    $iquery="SELECT species FROM masterspecies WHERE speciesidno=$species"; 
    $ires=mysql_query($iquery) or die('191 '.mysql_error()); 
    $irow=mysql_fetch_array($ires); 
    $SpeciesName.=$irow[0]; 



    echo '<tr><td>Total '.$SpeciesName.'s</td><td> '.$totalkills.' </td></tr>'; 
} 

} 


if($gamebookbool){ 
$longprev=0; 
$latprev=0; 
$longdegstometers=10000000/90; 
$latdestom=0; 
$totaldistanceinm=0; 

$query="SELECT MIN(gmttimestamp) from trips_data WHERE userid=$userid"; 
$result=mysql_query($query)or die(' '.mysql_error()); 
$row=mysql_fetch_array($result); 
$st=$row[0]; 
$date=date("j:F",$st); 
echo'<tr><td> First Trip </td><td> '.$date.'</td></tr>'; 

    //for all trips 
    $allTripsForHunter=allTripsForHunter($userid); 
    $yearDistance=0; 
    for($i=0;$i<count($allTripsForHunter);$i++){ 
$query="SELECT latitude, longitude FROM trips_data WHERE tripid=$allTripsForHunter[$i] AND userid=$userid ORDER BY gmttimestamp"; 

$res=mysql_query($query)or die(' '.mysql_error()); 
i f(mysql_num_rows($res)>0){  
    for($i=0;$i<mysql_num_rows($res);$i++){ 
    $row=mysql_fetch_assoc($res); 
    $long=$row['longitude']; 
    $lat=$row['latitude']; 
    if($i==0){ 
     $longprev=$long; 
     $latprev=$lat; 
     $latdestom=cos($long)*$longdegstometers; 
    } 
    if($i>=1){ 
     $dlongM=($longprev-$long)*$longdegstometers; 
     $dlatM=($latprev-$lat)*$latdestom; 
     $distance=sqrt(($dlatM*$dlatM)+($dlongM*$dlongM)); 
     $totaldistanceinm+=$distance; 
     $longprev=$long; 
     $latprev=$lat; 
     } 
    } 
      $yearDistance+=$totaldistanceinm; 
     } 
    } 
echo '<tr><td> Distance Traveled </td><td> '.number_format(($yearDistance/1000),2).' Km ('.number_format(($yearDistance/1000)*(0.62137),2).' miles)</td></tr>'; 


    $yearDuration=0; 

    for($i=0;$i<count($allTripsForHunter);$i++){ 
     $query="SELECT MIN(gmttimestamp) from trips_data WHERE tripid=$allTripsForHunter[$i] AND userid=$userid"; 
     $result=mysql_query($query)or die(' '.mysql_error()); 
     $row=mysql_fetch_array($result); 
     $st=$row[0]; 
     $starttime=date('H:i',$row[0]); 

     $query="SELECT MAX(gmttimestamp) from trips_data WHERE tripid=$allTripsForHunter[$i] AND userid=$userid"; 
     $result=mysql_query($query)or die(' '.mysql_error()); 
     $row=mysql_fetch_array($result); 
     $et=$row[0]; 
     $starttime=date('H:i',$row[0]); 

     $dur=($et-$st); 
     $yearDuration+=$dur; 
    } 
    $days=($yearDuration-($yearDuration%86400))/86400; 
    $hrs=(($yearDuration%86400)-($yearDuration%3600))/3600; 
$mins=((($yearDuration%3600)-($yearDuration%60))/60); 

    echo '<tr><td>Duration</td><td>'.$days.' Days '.$hrs.' Hours '.$mins.' Mins </td></tr> '; 

    $query="SELECT SUM(killcount) FROM trips_data WHERE userid=$userid"; 
$res=mysql_query($query) or die(' '.mysql_error()); 
$row=mysql_fetch_array($res); 
$totalk=$row[0]; 
echo '<tr><td>Total Kills</td><td>'.$totalk.'</td></tr>'; 
echo '<tr><td>Kills/Hour</td><td>'.number_format(($totalk*3600/$yearDuration),2).'</td></tr>'; 

$query="SELECT DISTINCT species from trips_data WHERE userid=$userid AND NOT killcount=0"; 
$res=mysql_query($query)or die('87'.mysql_error()); 
$number=mysql_num_rows($res); 

for($i=0;$i<$number;$i++){ 
    $row=mysql_fetch_assoc($res); 

    $species=$row['species']; 
    $SpeciesName=""; 

      $iiquery="SELECT SUM(killcount) FROM trips_data WHERE userid=$userid AND species=$species"; 
    $iires=mysql_query($iiquery) or die('107 '.mysql_error()); 
    $iirow=mysql_fetch_array($iires); 
    $totalkills=$iirow[0]; 

      if($species<1){ 
     $species*=-1; 
     $SpeciesName="Seen "; 

    } 

    $iquery="SELECT species FROM masterspecies WHERE speciesidno=$species"; 
    $ires=mysql_query($iquery) or die(' '.mysql_error()); 
    $irow=mysql_fetch_array($ires); 
    $SpeciesName.=$irow[0]; 



    echo '<tr><td>Total '.$SpeciesName.'s</td><td> '.$totalkills.' </td></tr>'; 
} 



} 
?> 
+0

首先,你需要配置您的应用程序和数据库,找到瓶颈。然后你可以得出结论,你需要重构/优化代码。直到提供的信息,你的问题不应该以这种方式问,因为瓶颈,可以在许多不同的地方,和其他人都告诉你一些基础你的决定是不是一个问题并不在这里帮助很大。剖析你的应用程序,然后询问如何改进某个地方。 http://xdebug.org/docs/profiler http://derickrethans.nl/talks.html – hakre

+1

你的变量,比如'$ minlat'注射直接进入SQL没有解除污染,因此这个应用程序也可以很快破解。如果你正在使用这个旧的数据库库,_always_会跳过你的用户输入!查看手册中的'mysql_real_escape_string'。 – halfer

+0

删除mysql库并学习使用pdo:http://php.net/manual/en/book.pdo.php – Johan

回答

4

其中有人告诉我不应该导致性能问题

恰恰相反。当按原样使用时,它当然会。必须正确设计查询和数据库以避免性能问题。

您必须优化您的查询。

  1. 运行它们都在控制台
  2. 注意的执行时间。
  3. 以最慢的一个,并运行它,用字EXPLAIN
  4. 研究输出perpended和问问吧
  5. 重复的问题,直到完成。