Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: оптимизация работы с MySQL?
 
 автор: Alex Boxgorn   (13.01.2009 в 11:41)   письмо автору
 
 

Хочу у вас спросить совета как правильно работать с БД.
До текущего момента проблем небыло, когда в таблицах было не более 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>";
            } 

  Ответить  
 
 автор: Trianon   (13.01.2009 в 12:15)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Alex Boxgorn   (13.01.2009 в 12:38)   письмо автору
 
   для: Trianon   (13.01.2009 в 12:15)
 

Согласен! По сравнению с эти запросом, мой пример выглядит нелепо ;-)
А где можно почитать доку по конфигурированию и синтаксису сложных запросов? А то пора уж мне подрости, а дальше простых запросов ни как уйти не могу.

Еще вопрос. Есть смысл индексировать поля таблиц учавствующих в ORDER BY или это не влияет на скорость обработки запроса?

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

  Ответить  
 
 автор: Trianon   (13.01.2009 в 12:53)   письмо автору
 
   для: Alex Boxgorn   (13.01.2009 в 12:38)
 

Влияет. В большинстве случаев, хотя и не всегда.
idpage явно требует индекса
http://dev.mysql.com/doc/refman/5.1/en/optimization.html

  Ответить  
 
 автор: Alex Boxgorn   (13.01.2009 в 12:59)   письмо автору
 
   для: Trianon   (13.01.2009 в 12:53)
 

Последний вопрос. После выполнения запроса появилось новое поле в склеенной таблице - COUNT(s.idpage). Именно такое название у поля в новой таблице после выполнения запроса. Как из него достать значение?
$countpunkt66= mysql_result($result7, $i , s.idpage); - не помогает.
Я как-то не так достаю значение поля?

  Ответить  
 
 автор: Trianon   (13.01.2009 в 13:04)   письмо автору
 
   для: 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);

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования