mysqli_store_result () против mysqli_use_result () - PullRequest
33 голосов
/ 26 марта 2012

вопрос

В чем разница между mysqli::store_result() и mysqli::use_result()?

История

Неопределенная документация

Документация на PHP.net кажется очень расплывчатой ​​относительно разницы между ними. Страница mysqli::use_result() не предлагает никаких примеров кода и связывает вас с страницей mysqli::multi_query(), чтобы искать их. На этой странице приведен следующий пример кода (полный код см. На странице):

/* store first result set */
if ($result = $mysqli->store_result()) {
    while ($row = $result->fetch_row()) {
        printf("%s\n", $row[0]);
    }
    $result->free();
}
/* print divider */
if ($mysqli->more_results()) {
    printf("-----------------\n");
}

Страница mysqli::store_result() использует точно тот же пример кода, с одним исключением:

/* store first result set */
if ($result = $mysqli->use_result()) {

Да ... store_result стало use_result. Обратите внимание, что даже в приведенном выше комментарии все еще говорится «магазин».

Еще более запутанно

Посмотрев примеры кода, я подумал; "все в порядке, так что это псевдоним". Но ждать! Документация дает следующие описания:

  • mysqli_store_result - передает набор результатов из последнего запроса
  • mysqli_use_result - Инициировать получение набора результатов

Они кажутся двумя разными вещами и совсем не похожи на псевдонимы. При более внимательном рассмотрении я обнаружил, что было еще одно исключение в примере кода страницы mysqli::use_result(): $result->free(); стал $result->close();. Однако мои надежды на выяснение правды вскоре были разрушены, когда я обнаружил, что на той же странице во втором примере кода (процедурный эквивалент) использовалось mysqli_free_result($result);, а не ожидаемое mysqli_close_result($result);.

Ответы [ 3 ]

37 голосов
/ 26 марта 2012

mysqli::store_result() будет извлекать весь набор результатов с сервера MySQL, а mysqli::use_result() будет извлекать строки одну за другой.

Это также упоминается в mysqli::use_result документах, с которыми вы связаны:

Функция mysqli_use_result () не передает весь набор результатов из базы данных и, следовательно, не может использовать функции, такие как mysqli_data_seek (), для перемещения в конкретную строку в наборе. Чтобы использовать эту функциональность, набор результатов должен быть сохранен с помощью mysqli_store_result (). Не следует использовать mysqli_use_result (), если выполняется много обработки на стороне клиента, поскольку это свяжет сервер и не позволит другим потокам обновлять любые таблицы, из которых извлекаются данные.

Обычно вы всегда можете использовать mysqli::store_result(), если у вас нет веских причин не читать все строки с сервера сразу.

15 голосов
/ 26 марта 2012

use_result возвращает результат без буферизации .

store_result возвращает результат с буферизацией .

0 голосов
/ 17 февраля 2017

Я думаю, что это может помочь людям получить доступ к языкам, которые поддерживают извлечение данных через массивы или перечислители.Потому что это как раз и есть разница.

. Для .NET будет такая же разница, как и GetDirectories (store_results) против EnumerateDirectories (use_results) (и File /DbResult / синтаксический анализ CSV / эквиваленты синтаксического анализа XML).

Вариант перечислителя использует меньше (PHP) клиентской памяти и может асинхронно извлекать следующую строку в фоновом режиме, пока текущая строка обрабатывает, что делает ее как большей памятью, так и обработкойвремя эффективно на стороне клиента.За счет более длительного использования (SQL) ресурсов сервера (так как набор результатов не был полностью передан).

В свою очередь, способ get / array будет извлекать данные в одной операции блокировки, занимая большепамять на стороне клиента для более раннего освобождения памяти БД.

Лично я бы по умолчанию выбрал не-Enumerator Way, если только у вас не возникли проблемы с (клиентской) памятью.

В .NET вы должны использоватьСпособ перечисления, если вы столкнетесь с лимитом 2/3 ГиБ для процессов x32.Особые EnumerateLines для файлов важны здесь.С результатами БД для начала не должно случиться.Результат в 2 ГБ БД либо way недофильтрован (выполните дополнительную фильтрацию в Query), либо содержит много BLOB-объектов (которые следует загружать по частям или даже, если возможно, браузер извлекает через обработчик http).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...