簡體   English   中英

PHP / MySQL速度很慢,不知道為什么?

[英]PHP / MySQL is slow, can't figure out why?

即使正在輪詢兩個節目,第一個函數recentlyModified()也會在1秒內准確運行。 我承認,它需要處理的參數要少得多,但是每場演出大約要0.5秒,因此速度很快。

但是,第二個函數myList()對於4個標題大約在16秒內運行,對於2個標題,大約11秒運行,對於一個標題,則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;
    }       
}

?>

您的查詢是動態構建的,因此在那里很難看到任何內容,但是構建起來看起來很簡單,所以我懷疑查詢非常簡單。

但是,您具有連接到數據庫並對每個主查詢返回的記錄進行查詢的函數。 這些似乎沒有必要,因為您似乎可以執行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 . "

這也是問題所在。

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

您的“ userid”在您的where子句中,在一個大表上,如果此字段不是索引,它將變得非常慢。 進入您的MySQL表並在此列中添加索引,例如。

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

這將大大加快速度。

一般經驗法則,where子句中的任何字段都需要索引。 默認情況下,MySql將索引主鍵。 因此,您無需手動索引主鍵(即ID字段)。

好吧,我最終按照建議在數據庫中進行了所有更改: https : //www.percona.com/blog/2006/09/29/what-to-tune-in-mysql-server-after-installation /

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM