Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация сайта, прошу помощи, Долго отрабатывает скрипт 
:(
    Опции темы
sanich_
  Дата 2.3.2008, 19:16 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Вопрос в следующем

еще не законченная страница сайта генерируется за 0,52 ms на локальном сервере,
это время включает все операции (выборка из базы, работа php)

Хороший ли это показатель? Надо ли оптимизировать?


Страница состоит из двух  частей:

1 левая рубрикатор - на ее часть отводится примерно 0,25-0,30 ms
2 Центральная список данных - очень большая 0,25-0,3ms думаю здесь нормально

Вот кусок кода левой проблемной части, есть ли здесь проблемные места?

Что касается базы, то выбоки не дожны тормозить, построены индексы по полям:
order_
id_categ
 
Код

$ds=mysql_query("select id_categ,categ from categ order by order_");
  while ($ds_arr = mysql_fetch_array($ds))
  {
   echo ('<tr><td class="CategTDItem"><a href="#" onClick="expand_cat('.$ds_arr['id_categ'].');return false;">'.$ds_arr['categ'].'</a></td></tr>');
   $ds2=mysql_query("select * from rubrika where id_categ=".$ds_arr['id_categ']." order by order_");
   $count_rows=mysql_num_rows($ds2);
   if ($count_rows>0)
   {
     if ($ds_arr['id_categ']==$id_categ) $display='block'; else $display='none';
     echo ('<tr><td><div style = "position:relative; display:'.$display.';" id="'.$ds_arr['id_categ'].'" >');
     echo ('<table cellspacing = "0" cellpadding = "0" border="0" width="100%">');
     while ($ds2_arr = mysql_fetch_array($ds2))
     {
      if ($ds2_arr['id_rubrika']==$_GET['id_rubrika']) $font_style='style="color:#CB7B02;"'; else $font_style='';       
      echo ('<tr><td class="RubrikaTDItem"><a href="index.php?id_rubrika='.$ds2_arr['id_rubrika'].'" '.$font_style.'>'.$ds2_arr['rubrika'].'</a></td></tr>');
     }
     echo ("</table></div></td></tr>");
   }
  } 



PM MAIL   Вверх
GeneralElectric
Дата 2.3.2008, 20:52 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



скажи, ты буковки ms для красоты пишешь, или это действительно миллисекунды?

Цитата(sanich_ @  2.3.2008,  19:16 Найти цитируемый пост)
Что касается базы, то выбоки не дожны тормозить

прелестное утверждение. вне зависимости от того, тормозит база, или нет.
Просто прелестное.

PM MAIL   Вверх
Sannis
Дата 3.3.2008, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.8.2007
Где: Москва

Репутация: 6
Всего: 13



Цитата(sanich_ @  2.3.2008,  19:16 Найти цитируемый пост)
еще не законченная страница сайта генерируется за 0,52 ms на локальном сервере,это время включает все операции (выборка из базы, работа php)

Это первое открытие страницы, или второе? (результаты обычно отличаются из-за внутреннего кеширования в php)
Понимаю, что сравнивать нехорошо, но форум, подобный этому, со второго раза у меня отображается за 0.05-0.08 s. Так что есть к чему стремиться smile


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
sanich_
Дата 3.3.2008, 12:06 (ссылка)  | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



1. Это действительно милисекунды
2. Странно как то но сейчас страница генерируется за 0.13ms после кеширования, когда проставил индексы этого срузу не ощутилось, индексы начинают работать после перезагрузки сервера?
PM MAIL   Вверх
skyboy
Дата 3.3.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(sanich_ @  3.3.2008,  11:06 Найти цитируемый пост)
 индексы начинают работать

cсразу после создания, насколько мне известно. с другой стороны, индексы - только механизм. если твои запросы не допускают использование индексов, то наличие/отсутствин индекса никак не отобразится на скорости.
PM MAIL   Вверх
awers
Дата 3.3.2008, 13:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



жутко криво... очень много времени.
PM MAIL WWW ICQ Skype   Вверх
sanich_
Дата 3.3.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Цитата(skyboy @ 3.3.2008,  12:35)
Цитата(sanich_ @  3.3.2008,  11:06 Найти цитируемый пост)
 индексы начинают работать

cсразу после создания, насколько мне известно. с другой стороны, индексы - только механизм. если твои запросы не допускают использование индексов, то наличие/отсутствин индекса никак не отобразится на скорости.

Давайте попорядку..

1. Я построил индексы по полям которые учавствуют в запросе where и order, не силен в оптимизации но мои знания подсказали что нужно сделать именно так.

Результат: страница стала генерироваться за 0,13-0,10 ms после кешировая запросов

Это долго?Что можно еще сделать? Код PHP оптимизируемый?
PM MAIL   Вверх
awers
Дата 3.3.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



sanich_, обычно оптимизируют логику, а не просто код
PM MAIL WWW ICQ Skype   Вверх
GeneralElectric
Дата 3.3.2008, 13:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



sanich_, наверное, ты имеешь в виду все-таки секунды.
а оптимизировать работу БД надо не теоретически,  "я там где-то какие-то индексы поставил", а практически.
В частности, измерять время выполнения запросов. А не заявлять, что они работают быстро, хотя ты это никак не проверил
PM MAIL   Вверх
mishaSL
Дата 3.3.2008, 14:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



sanich_, дам свои несколько комментариев:
1. Код который ты привел очень "кривой". Построение этого списка нужно делать с помощью 1 запроса. Нужно избегать вложенные с цикл запросы.
2. На мой взгляд, если БД практически пустая и ты это делаешь на локальном сервере, то это большое время. (Опять таки если ты имеешь в виду 0.52 сек, если это 0.52 миллисекунды то  это очень хороший результат).
3. Измерей кол-во запросов к БД при генерации одной страницы, их кол-во желательно тоже минимизировать.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
sanich_
Дата 3.3.2008, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Цитата(mishaSL @ 3.3.2008,  14:05)
sanich_, дам свои несколько комментариев:
1. Код который ты привел очень "кривой". Построение этого списка нужно делать с помощью 1 запроса. Нужно избегать вложенные с цикл запросы.
2. На мой взгляд, если БД практически пустая и ты это делаешь на локальном сервере, то это большое время. (Опять таки если ты имеешь в виду 0.52 сек, если это 0.52 миллисекунды то  это очень хороший результат).
3. Измерей кол-во запросов к БД при генерации одной страницы, их кол-во желательно тоже минимизировать.

Сорри, конечно же секунды, сразу не понял о чем вы мне говорили,
Спасибо за советы, щас все обдумаю, отпишусь о принятых мерах
PM MAIL   Вверх
sanich_
Дата 4.3.2008, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



Код


$ds=mysql_query("select t.id, t.name_, t.type_ from ".
                                                "(select id_categ id, categ name_,0 type_, order_ categ_order, -1 rubrika_order from categ".
                                                " union all".
                                                " select r.id_rubrika id, r.rubrika,1 type_, c.order_, r.order_ from rubrika r,categ c where r.id_categ=c.id_categ) t ".
                  "order by t.categ_order, t.rubrika_order");
  while ($ds_arr = mysql_fetch_array($ds))
  {
   if ($ds_arr['type_']==0)
   {
    if ($is_first==2) echo '</table></td></tr>'; 
    $cur_id_categ=$ds_arr['id'];
    echo '<tr><td class="CategTDItem"><a href="#" onClick="expand_cat('.$ds_arr['id'].');return false;">'.$ds_arr['name_'].'</a></td></tr>';
    $is_first=1;
   }
   else
   {
    
    if ($is_first==1) 
    {
     if ($cur_id_categ==$id_categ) $display='block'; else $display='none';
     echo '<tr style = "position:relative; display:'.$display.';" id="'.$cur_id_categ.'"><td><table cellspacing = "0" cellpadding = "0" width="100%">';
    } 
    
    if ($ds_arr['id']==$_GET['id_rubrika']) $font_style='style="color:#CB7B02;"'; else $font_style='';       
    echo '<tr><td class="RubrikaTDItem"><a href="index.php?id_rubrika='.$ds_arr['id'].'" '.$font_style.'>'.$ds_arr['name_'].'</a></td></tr>';
    $is_first=2;
   }    


Переписал страницу, ушел от вложенных в цикл подзапросов, но проблема со скоростью не разрешилась, теперь сам запрос долго выполянется

Только на запрос уходит ~16ms-30ms
Код


select t.id, t.name_, t.type_ from
             (select id_categ id, categ name_,0 type_, order_ categ_order, -1 rubrika_order from categ
              union all
              select r.id_rubrika id, r.rubrika,1 type_, c.order_, r.order_ from rubrika r,categ c where r.id_categ=c.id_categ) t
order by t.categ_order, t.rubrika_order


План запроса показал следующее, подскажите пожалуйста как оптимизировать


Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  Untitled_1___________.jpg 33,99 Kb
PM MAIL   Вверх
GeneralElectric
Дата 4.3.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 797
Регистрация: 11.1.2008

Репутация: 13
Всего: 16



mishaSL, вот хотел я возразить, но не стал.
И что получилось.
От такой вот "оптимизации" - один вред.
Во-первых, запросы в цикле - не всегда зло. 20, скажем, однострочных выборок  по первичному индексу никого ничем не затормозят.
Во-вторых, желание "хоть тушкой, хоть чучелком" но запихнуть все в один запрос приводит к появлению таких вот монстров. Злокачественных опухолей на теле реляционной модели. Суть осталась та же, но можем гордо рапортовать, что один запрос!!!
Вообще, появление в мускуле вложенных ползапросов и юниона принесло очень много вреда, учитывая тот факт, что в подавляющей массе своей люди, использующие мускуль, являются новичками.
Это как коробка-автомат. Да, научиться ездить очень легко. Но водителем он уже никогда не станет. 

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

sanich_
если вернуться к первому варианту.
Сколько времени выполняется запрос 
select id_categ,categ from categ order by order_
в консоли mysql.exe
и сколько - вложенный в него, из рубрик. один, не все.

они должны исполняться, каждый, не дольше одной сотой секунды (мускуль пишет что-то вроде (0.05 sec).
причем выполнять надо не один раз, а несколько раз подряд.

И постарайся не путаться с указанием времени. Это не так уж и сложно - отличать секунды от миллисекунд и писать десятичные доли секунды.
а ещё лучше - не от себя время пиши, а копируй из консоли.

Это сообщение отредактировал(а) GeneralElectric - 4.3.2008, 11:38
PM MAIL   Вверх
mishaSL
Дата 4.3.2008, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 19
Всего: 54



sanich_, SQL запрос должен быть примерно такой:
Код

SELECT `categ`.`id_categ`, `categ`.`categ`, `rubrika`.`id_rubrika`, `rubrika`.`rubrika`
FROM `categ` LEFT JOIN `rubrika` ON `categ`.`id_categ` = `rubrika`.`id_categ`  
ORDER BY `categ`.`categ_order`, `rubrika`.`rubrika_order` ASC


Как его результаты обработать в PHP думаю уже разберешься.

Добавлено через 8 минут и 36 секунд
GeneralElectric, я не говорю что всегда стоит все пихать в один запрос, но конкретно в данной ситуации - это практически стандартный и очень простой запрос. Здесь не должно быть никаких UNION и тем более вложенных запросов. Именно по-этому я дал такую критику вложенных в цикл запросов, т.к. в данном случае не используется никаких LIMIT, что может с ростом сайта привести к проблемам в его загрузке.



--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
sanich_
Дата 4.3.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



to GeneralElectric
Ну если чесно то самый первый вариант получения данных был хотябы проще для понимания, выбрал категорию, выбрад рубрики и.д.
А щас большой массив данных который еще пришлось по хитрому обработать, но повышения производительности это не прибавило!

Консоли Mysql у меня нет, стоит пакет TopServer, в папке mysql5 только mysqld-max-nt.exe ядро и тулза для дампа
Короче, я пользуюсь SQL yog enterprise

Запрос
select id_categ,categ from categ order by order_
в статус баре пишет то 0ms то 16ms, но чаще 0ms при многократном вызове, всего строк 42
Возможно не точно время определяется, подскажите как его точно засечь

Запрос
select id_rubrika,rubrika from rubrika where id_categ=2
7 строк, время 0ms

Наверно, по этим реультатам судить о скорости сложно, надо или более точное время или проверять на в цикле на N раз вызовов, но в этой версии мускуля нет хранимок и функци раньше я проверял производительность простых запросов именно так.

Щас и не знаю как проверить, разве что на ПХП мастерить цикл.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.