Быстродействие скрипта PHP + MySQL... @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 15 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
raskolbas
новый человек
0
Сообщения: 23
Зарегистрирован: 18.11.03
Откуда: Россия
Заголовок сообщения: Быстродействие скрипта PHP + MySQL...
Сообщение Добавлено: 2 Февраль 2005, 06:30:13 
Строится архив новостей. Кол-во месяцев на данный момент - 20. Новости есть почти за каждый день, по несколько штук.

Архив строится в виде обычного календаря, если есть новость за конкр. дату, есть ссылка (всё как обычно).

База новостей лежит в MySQL (4.0.19). Ось - Win2k. Apache 1.3.31. PHP - 4.3.9. Вместо сервера обычный комп P4 1.8

Скрипт отрабатывает секунды 3-4, что, как мне кажется, многовато...

Вот код:

Код:
$out = mysql_query("SELECT id FROM articles WHERE adate='$ndate' LIMIT 1");

if ( mysql_num_rows($out) )
{
     // даём ссылку
}


Пробовал делать COUNT в SELECT-е, то же самое.

Есть идеи, как увеличить скорость работы скрипта?

Заранее благодарен.


Последний раз редактировалось raskolbas 2 Февраль 2005, 20:04:44, всего редактировалось 1 раз.
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 2 Февраль 2005, 07:41:37 
Прочитать, что такое индексы.

_________________
We've got the big memory and the small memory. The small memory's to remember the small things and the big memory's to forget the big ones.
eo
новый человек
0
Сообщения: 150
Зарегистрирован: 07.06.04
Откуда: масква
Сообщение Добавлено: 2 Февраль 2005, 11:02:46 

Crazy писал(а):
Прочитать, что такое индексы.



И вообще почитать. Я часто встречаю такое: для хранения типа 1 или 2 или 3 используют int, хотя ясен перец надо enum.

_________________
наша жизнь полна чудесных и странных превращений...
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 2 Февраль 2005, 11:33:42 

Цитата:
$out = mysql_query("SELECT id FROM articles WHERE adate='$ndate' LIMIT 1");


мысль одним запросом выбрать все нужные даты не приходила в голову?
raskolbas
новый человек
0
Сообщения: 23
Зарегистрирован: 18.11.03
Откуда: Россия
Сообщение Добавлено: 2 Февраль 2005, 13:14:26 
… даты выбирать DISTINCT, бросать в массив, а потом при переборе дат календаря искать по массиву? Приходила. Но пока не проверял (замерю время, результаты сообщу). Чисто интуитивно кажется, что медленнее будет...

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

Просто никогда ещё не сталкивался с проблемой быстродействия MySQL - не имел больших таблиц сложных запросов. Обычно всё намного проще. А заморачиваться над таблицей в 10 Кбайт это извращение...
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 2 Февраль 2005, 13:40:42 
Интуиция тебя подводит.
В любом случае, тормоза есть где-то еще. для 30 запросов 4 секунды все равно очень много
raskolbas
новый человек
0
Сообщения: 23
Зарегистрирован: 18.11.03
Откуда: Россия
Сообщение Добавлено: 2 Февраль 2005, 14:00:41 
Какие 30 запросов?! 20 месяцев, по 30 дней в каждом (в среднем) - 600 запросов!
Смотрел загрузку ЦП - в основном, MySQL. PHP совсем не много.…

завтра расскажу, что вышло в результате сравнения... INDEX vs SELECT vs SELECT DISTINCT & Arrays
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 2 Февраль 2005, 14:47:36 

raskolbas писал(а):
Какие 30 запросов?! 20 месяцев, по 30 дней в каждом (в среднем) - 600 запросов!



Дружище, ты уж определись, где у тебя гон. В исходном сообщении четко означено, что запрос один:


Цитата:
Скрипт отрабатывает секунды 3-4, что, как мне кажется, многовато...

Вот код:

Код:
$out = mysql_query("SELECT id FROM articles WHERE adate='$ndate' LIMIT 1");

if ( mysql_num_rows($outcome9) )
{
     // даём ссылку
}



Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 2 Февраль 2005, 15:01:42 
ХАХАХАХАХА!
Я-то думал, что календарь выводится на месяц!


Цитата:
завтра расскажу, что вышло в результате сравнения


можешь не рассказывать.
я и без тестов тебе скажу, что 600 запросов - это, кхм... не очень умно.
И, как следствие - не очень быстро.
MIXA Муж.
соучастник
7
Сообщения: 993
Зарегистрирован: 19.09.04
Откуда: Москва
Сообщение Добавлено: 2 Февраль 2005, 15:58:25 
600 запросов??? :eek: Товарищ, здесь ОДНИМ запросом можно обойтись.
eo
новый человек
0
Сообщения: 150
Зарегистрирован: 07.06.04
Откуда: масква
Сообщение Добавлено: 2 Февраль 2005, 17:05:52 
Код:
select date from откуда-то where date >='2005-01-01' and date <='2005-12-31' group by date


Это навскидку... А вообще - читать Поля Дюбуа.

_________________
наша жизнь полна чудесных и странных превращений...
raskolbas
новый человек
0
Сообщения: 23
Зарегистрирован: 18.11.03
Откуда: Россия
Сообщение Добавлено: 2 Февраль 2005, 20:18:25 
Crazy, и своём первом сообщении я указал только часть кода, та, которая В ЦИКЛЕ вызывается и являет собой запрос. Кажется, я подробно объяснил смысл скрипта - постоить календарь (в моём случае за 2 года примерно), есть новость на конкретной дате - есть ссылка, нет новости - нет ссылки. Чтобы проверять, если ли новость за конкр.дату, выполняю указанный запрос, где $ndate - искомая дата.

eo, я, очевидно, не гений, но и не тормоз. Указанный Вами вариант имеет и свои недостатки (если, конечно, Вы сами поняли, что это вариант, предложенный Чебурген-ом, подразумевает хранение полученного результата в массиве с последующим поиском по этому массиву(in_array), что нагрузит PHP и память). А в Вашу "навскидку" не мешало бы DISTINCT добавить, кстати. Но мне почему-то кажется, что Вы задачу несколько недопоняли. Sorry.

ВСЕМ

Меня чудесным образом спасли индексы по полю adate. Каюсь, просто раньше не приходилось ими пользоваться. Теперь скрипт отрабатывает быстро, менее секунды. Результаты http://nojabrsk.info/archive

Всем спасибо, и ещё раз Sorry за глупый вопрос.
Чебурген
соучастник
3
Сообщения: 315
Зарегистрирован: 29.08.04
Сообщение Добавлено: 2 Февраль 2005, 20:42:16 
вау!
С каким экспертом нам посчастливилось познакомиться!
С каким знанием дела он рассуждает о недостатках тех или иных способов.
Как заботливо заботится о расходовании запредельных 6 килобайт памяти!
Как свысока смотрит на тех, кто сообщает ему неизвестные дотоле сведения уровня 2х2=4!

просто надо снять шляпу в немом восхищении.
модератор
новый человек
0
Сообщения: 82
Зарегистрирован: 10.07.04
Откуда: :адуктО
Сообщение Добавлено: 3 Февраль 2005, 00:06:51 
тааак, почитать бы мне новость за 14 июня.… че там у нас в ноябрьске...
raskolbas
новый человек
0
Сообщения: 23
Зарегистрирован: 18.11.03
Откуда: Россия
Сообщение Добавлено: 3 Февраль 2005, 06:51:36 
В общем, сделал так:

Код:
$out = mysql_query("SELECT DISTINCT adate FROM articles");
while ( $res = mysql_fetch_row($out) ) $dates[] = $res[0];


т.е. запрос один.

далее

Код:
if ( in_array($ndate,$dates) ) { // даём ссылку }


ну и ессно индексы. Чебурген, MIXA, Crazy, - спасибо, и извините, если что. Победила дружба :)
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 15 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100