PHP / MySQL медленный, не можете понять, почему?

Первая функция recentlyModified() запускается ровно за 1 секунду, даже если идет опрос двух шоу Признаюсь, у него гораздо меньше параметров для работы, но это чертовски быстро, примерно 0,5 секунды на шоу.

Вторая функция myList() однако выполняется примерно за 16 секунд для 4 заголовков, 11 секунд для 2 и 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

Решение

Ваш запрос создается динамически, поэтому трудно что-либо увидеть там, но его создание выглядит просто, поэтому я подозреваю, что запрос довольно прост.

Однако у вас есть функции, которые подключаются к базе данных и выполняют запрос для каждой записи, возвращаемой основным запросом. Это кажется ненужным, так как похоже, что вы можете просто выполнить 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

Другие решения

Это тоже проблема.

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

Ваш «идентификатор пользователя» находится в предложении where, в большой таблице это будет очень медленным, если это поле не является индексом. Зайдите в свою таблицу MySQL и добавьте индекс в этот столбец, например.

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

Это должно значительно ускорить процесс.

Общее правило: любое поле в предложении where нуждается в индексе. MySql по умолчанию будет индексировать первичные ключи. Таким образом, вам не нужно вручную индексировать первичные ключи (то есть поле идентификатора).

0

Что ж, в итоге я внес все изменения в настройки БД, как советовали здесь:https://www.percona.com/blog/2006/09/29/what-to-tune-in-mysql-server-after-installation/

-1
По вопросам рекламы [email protected]