2015-05-11 4 views
0

Я пытаюсь перебирать результат запроса из таблицы миллионов записей с помощью PDOStatement::fetch, но это занимает слишком много времени:PHP PDO Итерация

$stmt = $db->prepare('select * from logs'); 
if ($stmt->execute()) { 
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
     // some stuff... 
    } 
} 

Есть ли способ итерации по запросу результаты по одному вместо того, чтобы загрузить весь результат? Благодаря!

+3

ха? Вы получаете один ряд один за другим ?! 'fetchAll()' получит все результаты в одном. – Rizier123

+0

Конечно, потребуется много времени для повторения более миллиона записей, я бы рекомендовал добавить paginator. DataTables.net - хороший плагин, который вы можете использовать для этого. – Daan

+0

Если я выбираю «select * from logs limit 100», он возвращается один за другим. Но когда я удаляю «лимит», он слишком длинный. – micmia

ответ

0

В приведенном примере вы повторяете строки один за другим, и это точно так же, как и должно быть сделано. Вам придется рассмотреть другие варианты оптимизации в зависимости от stuff вы делаете с бревнами:

  1. отчеты, статистика - переместить некоторую логику в SQL запрос, возможно, база данных может сделать это гораздо быстрее.
  2. Автономная обработка - разбиение журналов и анализ их ex. один раз в день.
  3. Отображается - разбиение на страницы под результат с помощью SQL limit и offset.

Мы сможем помочь больше, если вы сообщите нам, что вы делаете с журналами.

+0

Спасибо @Furgas! На самом деле я хочу изменить поле (данные) для всех записей в таблице (в этом вопросе я назвал его «журналами», что бы ни было). Так что я должен искажать результаты, верно? – micmia

+0

@micmia Это зависит от объема модификации и если это одноразовый или периодический. Некоторые простые изменения могут быть выполнены с использованием одного обновления SQL. Если это слишком сложно, вам придется обновлять их по частям или просто ждать столько, сколько потребуется. Может быть, содержание foreach нуждается в оптимизации тоже, небольшое падение в обработке одной записи может повлиять на время обработки всего скрипта при работе с таким количеством записей. Вывод: никаких проблем с одной итерацией нет. – Furgas

0

Его никаких сомнений пагинацией придет с помощью Ajax и любит разберется ваш issues.Have посмотреть на Datatables обработки на стороне сервера. Я должен признать, что он широк, но как только вы обходите его, все будет гладко.

Посмотрите на this для реализации PDO Pagination.

Смежные вопросы