| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Базы Данных > Fatal error при sql запросе |
| Автор: PoTaP0ff 8.10.2007, 20:34 | ||||||
| Вообщем начал я тут доделывать кое че на одном форуме, но из-за хостера в одном месте лагает из-за превышения лимита ресурсов. Есть 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 8.10.2007, 20:56 |
| А сколько результатов запроса? В случае, если больше 100, есть смысл делать постраничку. |
| Автор: Glip 8.10.2007, 20:59 |
| можно немного выйграть если count($user_list) посчитать один раз а не при каждом проходе цикла. ну еще посмотреть explain запроса, может индексов навесить.. |
| Автор: PoTaP0ff 8.10.2007, 21:05 |
| chin, дофига, больше 500 точна буит. Glip, поподробнее плз. |
| Автор: chin 9.10.2007, 00:27 | ||
| Если скрипт используется часто, постраничку однозначно. Замеряйте время самого SQL запроса, делается это так:
Для того, чтобы сделать EXPLAIN, просто напишите это слово перед SELECT в своем запросе, и посмотрите результат. А лучше всего его в студию. Glip, Оптимизация с count() - спички по сравнению с его запросом ;) |
| Автор: PoTaP0ff 9.10.2007, 12:49 | ||||||||||
chin, вписал EXPLAIN перед SELECT, вот результат:
Сам же запрос, без вывода на экран, выполняется
Попробывал опять вывести на экран, снова время выполнения превышено:( Мож правда индексвов понавешать? Тока расскажите поподробнее, как и че, я в sql не силен... Вот тут мне предложили такой вариант:
воткнул этот запрос, получилось очень неплохо:
вместе с циклом обработал за:
меня эт очень радует, но хотелось бы еще чье нить мнение услышать... |
| Автор: flashaa 10.10.2007, 10:03 | ||
| Glip совершенно верно говорит про count(). Проверка условия в for выполняется на каждой итерации цикла. Следовательно функция выполняется столько раз сколько эл-тов в массиве. С другой стороны, чем больше элементов, тем медленнее работает count(). Получаем то, что время выполнения этой конструкции растет в геометрической прогрессии при увеличении размера массива. Вот, почитайте комменты на php.net - тут про это сказано - http://ru2.php.net/manual/en/function.count.php
|
| Автор: sTa1kEr 10.10.2007, 15:37 | ||||||
| PoTaP0ff, создайте индексы для полей b.ban_mod, b.ban_userid, b.ban_forum и самое главное сделайте поле b.ban_id первичным ключем! И приведите еще раз EXPLAIN. flashaa, Все правильно, но вот цифры очень странные... 2000 раз взять count() от массива из 2000 элементов - 19 секунд?! Что за тормознутый сервер тогда был у этого юзера?!
Результат
Тот же самый тест, но для 200 000 записей
|
| Автор: flashaa 10.10.2007, 17:08 |
| sTa1kEr, с чего Вы взяли, что именно count() cделал 19 сек? Что у него в цикле выполнялось - непонятно, не указано. Факт в том, что с count() в условии for тот же самый цикл работал в 95 раз дольше. |
| Автор: flashaa 10.10.2007, 17:45 |
| А вы попробуйте mysql_connect вставить в цикл, вот один из моих результатов: 0.00959801673889 sec 0.221158981323 sec |
| Автор: sTa1kEr 10.10.2007, 18:40 | ||||||
Попробовал на 1000 итерациях. Код
Результат
То что значения массива и их типы могут повлиять на скорость count() - это я могу понять (все таки каждое значение надо проверить на null), но вот с чего вдруг код внутри цикла должен влиять на скорость работы??? |
| Автор: flashaa 11.10.2007, 11:46 |
| Да, пожалуй, Вы правы на счет того что содержимое не влияет, да и время выполнения у меня каждый раз время разное - это показатель того, что на опыт сильно влияют другие факторы. Отпостил результаты одного из случаев с большой разницей в числах. Так что соглашусь с тем, что не count() скорее всего нагнал разницу, но использовать его следуеткак я писал |