2016-03-08 43 views
0

第一个函数recentlyModified()完全在1秒内运行,即使它正在轮询两个节目。我承认,它的参数要少很多,但每次演出大约需要0.5秒。PHP/MySQL很慢,想不明白为什么?

然而,第二个功能myList()在4秒左右运行16秒,2秒钟运行11秒,1秒运行6秒。这当然是平均的。

<?php 

include_once './php/loadanime.php'; 

function crunchyrollNews() { 
    echo('<iframe class="rss fullwidth fullheight" src="http://feeds.feedburner.com/crunchyroll/animenews?format=xml"></iframe>'); 
} 

function recentlyModified($count) { 
    $mtime = microtime(); 
    $mtime = explode(" ",$mtime); 
    $mtime = $mtime[1] + $mtime[0]; 
    $starttime = $mtime; 

    $animedb = new mysqli("localhost", "animedeck", "W8a7fs5gu"); 

    $query = $animedb->query("SELECT id, img, name, description FROM animedeck.animelist ORDER BY modified DESC LIMIT " . $count . "");  

    if($query) { 
     $result = $query->fetch_all(); 

     echo '<div class="recentanimemodule">'; 

     echo '<h1 class="h1 borderb">AnimeDeck Recent</h1>'; 

      foreach($result as $id) { 
       echo '<div class="recentanimepiece">'; 
       echo '<img class="recentanimeposter" src="'; 
       echo $id[1]; 
       echo '" />';  
       echo '<a class="recentanimeurl" href="'; //a href start 
       echo './viewanime.php?id=' . $id[0]; 
       echo '">'; 
       echo '<div class="recentanimename">'; 
       echo $id[2]; 
       echo '</div>'; 
       echo '</a>'; //a href end 
       echo '<div class="recentanimedes">'; 
       echo $id[3]; 
       echo '</div>'; 
       echo '</div>'; 
      } 

     echo '</div>'; 
    } else { 
     echo "Failed to retrieve entries."; 
    } 

     $mtime = microtime(); 
    $mtime = explode(" ",$mtime); 
    $mtime = $mtime[1] + $mtime[0]; 
    $endtime = $mtime; 
    $totaltime = ($endtime - $starttime); 
    echo "This module was created in ".$totaltime." seconds"; 
} 

function myList($status, $sort, $startindex, $count) { 

    $mtime = microtime(); 
    $mtime = explode(" ",$mtime); 
    $mtime = $mtime[1] + $mtime[0]; 
    $starttime = $mtime; 

    $animedb = new mysqli("localhost", "animedeck", "W8a7fs5gu"); 
    $orderby; 
    $title = "Recent"; 
    $rstatus = ", status='" . $status . "'"; 

    if($status == "all") { 
     $rstatus = null; 
    } 

    if($startindex == null) { 
     $startindex = 0;  
    } 

    switch ($sort) { 
    case "recent": 
     $sort = "DESC"; 
     $orderby="modified"; 
     $title = "Recent"; 
     break; 
    case "oldest": 
     $sort = "ASC"; 
     $orderby="modified"; 
     $title = "Oldest"; 
     break; 
    case "az": 
     $sort = "ASC"; 
     $orderby="animename"; 
     $title = "A to Z"; 
     break; 
    case "za": 
     $sort = "DESC"; 
     $orderby="animename"; 
     $title = "Z to A"; 
     break; 
    } 

    $query = $animedb->query("SELECT animeid FROM animedeck.mylist WHERE userid='" . $_SESSION['userid'] . "' " . $rstatus . " ORDER BY " . $orderby . " " . $sort . " LIMIT " . $startindex . ", " . $count . ""); 

    if($query) { 
     $result = $query->fetch_all(); 


     echo '<div class="myanimemodule">'; 

     echo '<h1 class="h1 borderb">MyList ' . $title . '</h1>'; 

      foreach($result as $id) { 
       $info = loadSemiAnime($id[0]); 

       echo '<div class="animeid">' . $id[0] . '</div>'; 
       echo '<div class="myanimepiece">'; 
       echo '<img class="myanimeposter" src="'; 
       echo $info['img']; 
       echo '" />';  
       echo '<a class="myanimeurl" href="'; //a href start 
       echo './viewanime.php?id=' . $id[0]; 
       echo '">'; 
       echo '<div class="myanimename">'; 
       echo $info['name']; 
       echo '</div>'; 
       echo '</a>'; //a href end 
       echo '<div class="myanimedes">'; 
       echo $info['description']; 
       echo '</div>'; 
       echo '</div>'; 
       echo '<div class="animelistoptions">'; 
       echo '<span onClick="setStatus(' . $id[0] . ', \''; 
       echo loadAnime($id[0], "name") . "'"; 
       echo ', 0)" id="stowatch' . $id[0] . '" class="bluebutton">To Watch</span>'; 
       echo '<span onClick="setStatus(' . $id[0] . ', \''; 
       echo loadAnime($id[0], "name") . "'"; 
       echo ', 1)" id="swatching' . $id[0] . '" class="bluebutton">Watching</span>'; 
       echo '<span onClick="setStatus(' . $id[0] . ', \''; 
       echo loadAnime($id[0], "name") . "'"; 
       echo ', 2)" id="swatched' . $id[0] . '" class="bluebutton">Seen</span>'; 
       echo '<span onClick="setStatus(' . $id[0] . ', \''; 
       echo loadAnime($id[0], "name") . "'"; 
       echo ', 3)" id="srewatching' . $id[0] . '" class="bluebutton">Re-Watching <i class="fa fa-heart"></i></span>'; 
       echo '</div>'; 

       echo '<script>getStatus(' . $id[0] . ');</script>'; 
      } 

     echo '</div>'; 
    } else { 
     echo "Failed to retrieve entries. Error: " . $animedb->errno . " --- " . $animedb->error; 
    } 


     $mtime = microtime(); 
    $mtime = explode(" ",$mtime); 
    $mtime = $mtime[1] + $mtime[0]; 
    $endtime = $mtime; 
    $totaltime = ($endtime - $starttime); 
    echo "This module was created in ".$totaltime." seconds"; 

} 

?> 

所以我的问题是,我不知道我的代码是什么造成它需要这么久?只需一次迭代6秒?它是PHP吗?我认为MySQL执行得非常快,所以我认为这是PHP。但是哪一部分?

我不熟悉什么是PHP的好和坏的做法,所以我不知道是什么真的放慢了我的功能。

这里是我的loadAnime()和loadSemiAnime()函数:

<?php 

function loadAnime($id, $toload) { 

    $animedb = new mysqli("localhost", "animedeck", "W8a7fs5gu"); 
    $load = $animedb->query("SELECT " . $toload . " FROM animedeck.animelist WHERE id=" . $id . ""); 

    if($load) { 
     $result = $load->fetch_assoc(); 

     echo $result[$toload]; 
    } 
} 

function loadSemiAnime($id) { 
    $animedb = new mysqli("localhost", "animedeck", "W8a7fs5gu"); 
    $load = $animedb->query("SELECT img, name, description FROM animedeck.animelist WHERE id=" . $id . ""); 

    if($load) { 
     $result = $load->fetch_assoc(); 
     return $result; 
    }  
} 

?> 
+0

尝试“解析SELECT animeid FROM animedeck.mylist WHERE userid = ...”并发布其结果 –

+0

loadAnime()和loadSemiAnime()函数做了什么。 – Kickstart

+0

圣...非常感谢你Kickstart。我知道每次需要一个变量时运行一个完整的查询是不好的,所以我让loadSemiAnime类加载了我需要一次的三个变量,然后重用这些变量。但是,我忘了将那些删除。 我现在正式下降到4秒,这是1秒/每场演出。这很棒。但现在我认为我可以在一般表现上做得更好。目前我的数据库运行良好,因此我猜想下一步的实际工作是尝试优化代码,然后再优化数据库。 – revofire

回答

0

您的查询动态生成所以很难看到任何东西,但构建它看起来很简单,所以我怀疑查询很简单。

但是,您有连接到数据库的功能,并对主查询返回的每个记录执行查询。这些似乎是不必要的,因为它看起来像你可以做一个JOIN拿到场主查询: -

SELECT a.animeid, b.img, b.name, b.description 
FROM animedeck.mylist a 
LEFT OUTER JOIN animedeck.animelist b 
ON a.animeid = b.id 
WHERE a.userid='" . $_SESSION['userid'] . "' " . $rstatus . " ORDER BY " . $orderby . " " . $sort . " LIMIT " . $startindex . ", " . $count . " 
+0

因此,如果我实现它,它应该或多或少的工作?总结LEFT OUTER JOIN做了什么? – revofire

+0

LEFT OUTER JOIN是将两个表连接在一起,但是右边的表不需要有匹配的行(在这种情况下,该表中的列将具有NULL值)。 – Kickstart

+0

非常感谢。这减少了我的执行时间到1秒,即使我拉4个标题。从现在起我将不得不使用这个Join事物!太奇妙了!谢谢。 :) – revofire

0

这是问题为好。

$query = $animedb->query("SELECT animeid FROM animedeck.mylist WHERE userid='" . $_SESSION['userid'] . "' " . $rstatus . " ORDER BY " . $orderby . " " . $sort . " LIMIT " . $startindex . ", " . $count . ""); 

你的“用户id”是你的WHERE子句中,在一个大桌子这将是超级慢,如果这个领域是不是指数。进入你的MySQL表并添加一个索引到这个列,例如。

ALTER TABLE `animedeck` ADD INDEX `userid` (`userid`) 

这应该会大大加快速度。

一般的经验法则,where子句中的任何字段都需要一个索引。 MySql默认会索引主键。所以你不需要手动索引主键(即ID字段)。