Выборка из таблицы 1500000 строк не выводится

Тема в разделе "Как сделать...", создана пользователем new_forward, 26 мар 2015.

Статус темы:
Закрыта.
  1. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Доброго времени суток, с таким еще не сталкивался на своем опыте... обычный код, в таблице 1500000 строк:
    Код:
    $result = mysql_query("SELECT * FROM table");
    while($row = mysql_fetch_assoc($result)){
    
        $tags[] = $row;
    
    }
    
    print_r($tags); exit;
    
    
    Массив просто не выводится, если ограничить вывод до 100000 то выводится... Чего ему не хватает не понятно....
     
  2. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    608
    Симпатии:
    479
    Памяти например не хватает.
    Не только количество строк имеет значение, но и размер этих строк.

    Какую-нибудь ошибку выводит скрипт?

    error_reporting(e_all & e_notice) установлен?
     
    latteo нравится это.
  3. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Запускаю через ssh, никаких ошибок не выводит
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.451
    Симпатии:
    1.244
    Об ограничениях на размер потока вывода PHP не слышал - про ssh не знаю, всё же высока вероятность падения по лимиту памяти
    Включи вывод ошибок - http://storm.in.ua/a83/vklyuchit-pokaz-preduprejdeniy-i-oshibok-PHP.html

    Попробуй построчный принт (это правда замедлит общее выполнение скрипта, но зато по лимиту памяти не упадёт:(
    PHP:
    $result mysql_query("SELECT * FROM table");
    while(
    $row mysql_fetch_assoc($result)){

        
    print_r($row);

    }
    exit;
     
    Nei нравится это.
  5. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Непонятно зачем такой вывод — ведь отвалится же по таймауту или памяти.
    Получается — создаете 2 массива, даете сильную нагрузку.
    Используйте лимит хотя бы по 1000 строк:
    $result = mysql_query("SELECT * FROM table LIMIT 0,1000");

    Только сначала нужно посчитать сколько строк вообще:
    $count = mysql_query("SELECT COUNT(*) AS `cnt` FROM table");

    Ну а потом уже делать выборку частями по количеству $count['cnt']
     
  6. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Да, памяти маловато...

    Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 79 bytes) in /var/www/data/www/fix_tag.php on line 60

    Сократил таблицу на один столбец, трафик уменьшился, соответственно памяти стало меньше есть в два раза...все заработало.

    Всем спасибо!
     
    Последнее редактирование: 26 мар 2015
  7. klamas

    klamas Создатель

    Регистр.:
    20 мар 2015
    Сообщения:
    15
    Симпатии:
    2
    Почему бы не отказаться (желательно на всегда, вообще на всегда) от "SELECT * FROM table" в пользу "SELECT field1, field2, ... FROM table"
     
Статус темы:
Закрыта.