![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| PoTaP0ff |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.10.2007 Репутация: нет Всего: нет |
Вообщем начал я тут доделывать кое че на одном форуме, но из-за хостера в одном месте лагает из-за превышения лимита ресурсов. Есть 3 таблицы, в одной инфа о бане(ban_id, ban_userid, ban_ip, ban_email, ban_mod, ban_date, ban_forum, ban_text, ban_time; где ban_mod-id юзверя, который банил; ban_date-дата бана; ban_forum-id раздела, кде забанили; ban_text-причина бана; ban_time-длительность бана) во второй инфа о юзверях(нам от тудава нужны: user_id, username), ну и третья инфа о разделе(оттудава нужно: forum_name). Мне надо составить список забаненных юзверей в таком виде: имя забаненного юзверя|имя банившего|время бана|раздел|на сколько.
Всеб ничего, только проблема в том, что при sql запросе выскакиват ошибка:
сам запрос выглядет так:
дальше вся обработка происходит в цикле:
вот как раз в этом цикле и возникает ошибка, а номер стороки, которую показывает ошибка всегда рзный и колблеться внутри цикла. вообщем делал пошти все, даже начальный скрипт херачил - открывает секунд через 20 еле-еле. Это все как я понял из-за объема информации, как с этим бороться, мож кто знает? |
||||||
|
|||||||
| chin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.10.2006 Репутация: нет Всего: нет |
А сколько результатов запроса? В случае, если больше 100, есть смысл делать постраничку.
|
|||
|
||||
| Glip |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 473 Регистрация: 30.12.2006 Репутация: 1 Всего: 18 |
можно немного выйграть если count($user_list) посчитать один раз а не при каждом проходе цикла.
ну еще посмотреть explain запроса, может индексов навесить.. |
|||
|
||||
| PoTaP0ff |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.10.2007 Репутация: нет Всего: нет |
chin, дофига, больше 500 точна буит.
Glip, поподробнее плз. Это сообщение отредактировал(а) PoTaP0ff - 8.10.2007, 21:06 |
|||
|
||||
| chin |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 28.10.2006 Репутация: нет Всего: нет |
Если скрипт используется часто, постраничку однозначно.
Замеряйте время самого SQL запроса, делается это так:
Для того, чтобы сделать EXPLAIN, просто напишите это слово перед SELECT в своем запросе, и посмотрите результат. А лучше всего его в студию. Glip, Оптимизация с count() - спички по сравнению с его запросом ;) Это сообщение отредактировал(а) chin - 9.10.2007, 00:29 |
|||
|
||||
| PoTaP0ff |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.10.2007 Репутация: нет Всего: нет |
chin, вписал EXPLAIN перед SELECT, вот результат:
Сам же запрос, без вывода на экран, выполняется
Попробывал опять вывести на экран, снова время выполнения превышено:( Мож правда индексвов понавешать? Тока расскажите поподробнее, как и че, я в sql не силен... Вот тут мне предложили такой вариант:
воткнул этот запрос, получилось очень неплохо:
вместе с циклом обработал за:
меня эт очень радует, но хотелось бы еще чье нить мнение услышать... Это сообщение отредактировал(а) PoTaP0ff - 9.10.2007, 14:05 |
||||||||||
|
|||||||||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 2 Всего: 25 |
Glip совершенно верно говорит про count().
Проверка условия в for выполняется на каждой итерации цикла. Следовательно функция выполняется столько раз сколько эл-тов в массиве. С другой стороны, чем больше элементов, тем медленнее работает count(). Получаем то, что время выполнения этой конструкции растет в геометрической прогрессии при увеличении размера массива. Вот, почитайте комменты на php.net - тут про это сказано - http://ru2.php.net/manual/en/function.count.php
|
|||
|
||||
| sTa1kEr |
|
||||||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 9 Всего: 146 |
PoTaP0ff, создайте индексы для полей b.ban_mod, b.ban_userid, b.ban_forum и самое главное сделайте поле b.ban_id первичным ключем! И приведите еще раз EXPLAIN.
flashaa, Все правильно, но вот цифры очень странные... 2000 раз взять count() от массива из 2000 элементов - 19 секунд?! Что за тормознутый сервер тогда был у этого юзера?!
Результат
Тот же самый тест, но для 200 000 записей
Это сообщение отредактировал(а) sTa1kEr - 10.10.2007, 15:38 |
||||||
|
|||||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 2 Всего: 25 |
sTa1kEr, с чего Вы взяли, что именно count() cделал 19 сек? Что у него в цикле выполнялось - непонятно, не указано. Факт в том, что с count() в условии for тот же самый цикл работал в 95 раз дольше.
|
|||
|
||||
| sTa1kEr |
|
||||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 9 Всего: 146 |
Потому что иначе этот код не имеет смысла. Сравнивается скорость работы count(), а не непонятно какого кода замаскированного под многоточие.
Я очень сомневаюсь в достоверности этого факта. У меня в тесте получилось, что примерно в 3 раза дольше (причем не зависимо от количества элементов в массиве.) Я, конечно, предполагаю, что в этом коде такие цифры из-за того, что запускался он на какой-нибудь старой сырой версии PHP, но тогда нужно было писать это в баги, а не в комментарии мануала. PS Сейчас запустил аналогичный тест в PHP 4.4.7 - там разница не более чем в 2 раза. |
||||
|
|||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 2 Всего: 25 |
А вы попробуйте mysql_connect вставить в цикл, вот один из моих результатов: 0.00959801673889 sec 0.221158981323 sec
|
|||
|
||||
| sTa1kEr |
|
||||||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 9 Всего: 146 |
Попробовал на 1000 итерациях. Код
Результат
То что значения массива и их типы могут повлиять на скорость count() - это я могу понять (все таки каждое значение надо проверить на null), но вот с чего вдруг код внутри цикла должен влиять на скорость работы??? Это сообщение отредактировал(а) sTa1kEr - 10.10.2007, 18:40 |
||||||
|
|||||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 2 Всего: 25 |
Да, пожалуй, Вы правы на счет того что содержимое не влияет, да и время выполнения у меня каждый раз время разное - это показатель того, что на опыт сильно влияют другие факторы.
Отпостил результаты одного из случаев с большой разницей в числах. Так что соглашусь с тем, что не count() скорее всего нагнал разницу, но использовать его следуеткак я писал Это сообщение отредактировал(а) flashaa - 11.10.2007, 11:56 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |