|
|
|
| Хочу у вас спросить совета как правильно работать с БД.
До текущего момента проблем небыло, когда в таблицах было не более 200 записей. Сейчас в нескольких часто используемых базах уже под 1500 записей.
Есть один из 8 блоков по выводу странички со статистикой и данная страничка 20 секунд думает. Как можно ускорить или оптимизировать PHP-код или SQL-запросы?
Код ниже.
В этом модуле производится выборка страниц сайта (1 запрос-560 записей) это пол беды. Но в нутри цикла эти странички друг за другом обходим и из другой таблицы выбираем количество блоков принадлежащих данной странице - 1500 записей в таблице.
$result7 = mysql_query("SELECT * FROM tpages where a_hiden=0 order by namepage ASC");
for ($i = 0; $i < mysql_num_rows($result7); $i++) {
$namepage = mysql_result($result7, $i , namepage);
$startpage = mysql_result($result7, $i , startpage);
$textstartpage="";
if($startpage==1){$textstartpage=" - главная страница сайта";}
$idpart = mysql_result($result7, $i , id);
$id = mysql_result($result7, $i , id);
$result66 = mysql_query("SELECT * FROM tstatiy where idpage=$id");
$countpunkt66 = mysql_num_rows($result66);
If(empty($countpunkt66)){$countpunkt66="<b> (".$countpunkt66.")</b>";}else{$countpunkt66=" (".$countpunkt66.")";}
echo "<a target=\"_blank\" href=\"pages.php?page1=".$id."\" class=\"siniy\">".$namesite.$namepage."</a>".$textstartpage.$countpunkt66."<br>";
}
|
| |
|
|
|
|
|
|
|
для: Alex Boxgorn
(13.01.2009 в 11:41)
| | Весь этот идиотский код можно заменить одним запросом.
SELECT p.namepage, p.startpage, p.id, COUNT(s.idpage)
FROM tpages p LEFT JOIN tststiy s ON p.id = s.idpage
WHERE p.a_hidden = 0
GROUP BY p.id
ORDER BY p.namepage
|
| |
|
|
|
|
|
|
|
для: Trianon
(13.01.2009 в 12:15)
| | Согласен! По сравнению с эти запросом, мой пример выглядит нелепо ;-)
А где можно почитать доку по конфигурированию и синтаксису сложных запросов? А то пора уж мне подрости, а дальше простых запросов ни как уйти не могу.
Еще вопрос. Есть смысл индексировать поля таблиц учавствующих в ORDER BY или это не влияет на скорость обработки запроса?
Вот блин плохо, когда досконально не знаешь что влияет на скорость выполнения запроса и начинаешь заниматься экспериментами :-( | |
|
|
|
|
|
|
|
для: Alex Boxgorn
(13.01.2009 в 12:38)
| | Влияет. В большинстве случаев, хотя и не всегда.
idpage явно требует индекса
http://dev.mysql.com/doc/refman/5.1/en/optimization.html | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2009 в 12:53)
| | Последний вопрос. После выполнения запроса появилось новое поле в склеенной таблице - COUNT(s.idpage). Именно такое название у поля в новой таблице после выполнения запроса. Как из него достать значение?
$countpunkt66= mysql_result($result7, $i , s.idpage); - не помогает.
Я как-то не так достаю значение поля? | |
|
|
|
|
|
|
|
для: Alex Boxgorn
(13.01.2009 в 12:59)
| | $countpunkt66= mysql_result($result7, $i , 'COUNT(s.idpage)');
Можете назначить ему синоним SELECT p.namepage, p.startpage, p.id, COUNT(s.idpage) AS cnt
Вообще-то так строки извлекать не принято.
$row = mysql_fetch_assoc($result7);
что возвращает эта функция, можете посмотреть с помощью
print_r($row); | |
|
|
|