Mysql fetch связывает массив mysql fetch

Ниже приведены два метода, которые обычно используются в большинстве php-кодов для получения данных mysql.

  • mysql_fetch_array()
  • mysql_fetch_assoc()

Теперь у меня есть большая база данных. Для получения данных в циклах (while), что быстрее и лучше?

Я нашел этот тест.

Каков ваш выбор?

10 ответов

Это зависит от того, как настроены ваши таблицы:

mysql_fetch_array() по существу возвращает два массива с числовым индексом, один с ассоциативным индексом строки.

Таким образом, используя mysql_fetch_array() без указания MYSQL_ASSOC или MYSQL_NUM, или указав MYSQL_BOTH, вы вернете два массива (в основном, что вернет mysql_fetch_assoc() и mysql_fetch_row()), поэтому mysql_fetch_assoc() будет быстрее.

Если у вас правильная настройка таблицы и правильно написанный запрос mysql_fetch_assoc() - это путь, читаемость кода $result['username'] легче понять, чем $result[0].


Это результат   mysql_fetch_array()

$row['fieldname'] = 'some value';

или

$row[0] = some value';

Это результат mysql_fetch_assoc() будет возвращаться только

$row['fieldname'] = 'some value';


В вашем примере, который показан в вашем примере, используется mysql_fetch_array() без каких-либо аргументов для указания MYSQL_ASSOC или MYSQL_NUM, поэтому он по умолчанию имеет значение MYSQL_BOTH... это скорее исказит результат, так как ему нужно загрузить в два раза больше элементов массива, чем mysql_fetch_assoc(), Поэтому я бы предположил, что это не правильный тест.

В действительности, должно быть очень мало различий между mysql_fetch_array() с MYSQL_ASSOC и mysql_fetch_assoc(), и это не будет самым большим издержком в вашем script.


"Размер" результатов запроса не имеет значения в этом случае.

mysql_fetch_array() обычно создает накладные расходы, возвращая ассоциативный массив плюс индексированные результаты.

Нужно выбрать тип запроса и желаемые результаты о том, следует ли использовать mysql_fetch_array() или mysql_fetch_assoc().

Если служебные данные "не учитываются", и я уверен, что запрос завершается успешно, и я знаю только один результат, который я иногда делаю:

$q = mysql_query('SELECT `column1`,`column2` FROM `table` WHERE `id` = 123');
list($column1,$column2) = mysql_fetch_array($q);
mysql_free_result($q);

Для итеративного процесса (например, цикла while) это просто не сокращает его. Если нет необходимости в "быстро извлекаемых" результатах (через оператор list), и результат должен быть дополнительно обработан в коде, я всегда использую mysql_fetch_assoc() *.

* При принуждении фактически использовать устаревшие процедурные функции поиска данных PHP. Есть альтернативы.


Я предпочитаю fetch_assoc. Он возвращает "ассоциативный массив" (например, словарь python). Это означает, что ваш массив индексируется строкой (в моем обычном случае).

Значение по умолчанию для fetch_array дает как нумерованные индексы, так и ассоциативные индексы.

Но я никогда не использую нумерованные индексы, поэтому мне нравится немного быстрее с fetch_assoc


Еще один момент, чтобы иметь в виду, что fetch_assoc() может не возвращать каждый столбец, который вы ожидаете. Если 2 столбца вывода будут иметь одно и то же имя, только последний экземпляр этого столбца будет получен с помощью fetch_assoc(). Например, следующий запрос:

SELECT * FROM orders LEFT JOIN line_items ON orders.id = line_items.order_id

Предполагая, что обе таблицы имеют столбец с именем id, результирующий ассоциативный массив будет иметь ключ с именем id, значение которого равно line_items.id, и вы не сможете извлечь orders.id из результата!

Вы можете обойти эту проблему с повторяющимися именами столбцов и продолжать использовать fetch_assoc() путем ручного выравнивания столбцов SELECT, предоставляя каждому столбцу уникальный псевдоним:

SELECT 
o.id AS order_id, #unique alias
i.id AS line_item_id, #unique alias
o.date,
i.qty,
i.price
FROM orders o 
LEFT JOIN line_items i ON i.order_id = o.id

Или вы можете переключиться на использование fetch_array(), что позволит вам получить доступ к id по индексу, а не по клавише


Я полагаю, это зависит от вашего определения большого. Из этого теста вы можете видеть, что только до того, как вы произведете более 1 000 000 000 выборок, вы на самом деле получаете измеримую разницу? Является ли ваша база данных такой большой? Если нет, то перейдите с тем, что вам легче использовать (вероятно, для получения ассоциативного массива).

Еще один момент для рассмотрения, если он настолько велик, что есть измеримая разница, тогда я получаю возможность использовать все функции вместе. Подумайте о том, как использовать MySQLi или даже лучше использовать PDO!


Хорошо http://php.net/manual/en/function.mysql-fetch-assoc.php состояния

Примечание. Производительность

Важно отметить, что использование mysql_fetch_assoc() не значительно медленнее, чем использование mysql_fetch_row(), в то время как оно обеспечивает значительное добавленное значение.

Поэтому разница не должна беспокоить.


mysql_fetch_assoc(), вероятно, будет лучшим выбором. Существует небольшое поражение производительности (расширение mysql должно искать имена столбцов, но это должно происходить только один раз, независимо от того, сколько строк у вас есть), но, вероятно, недостаточно, чтобы оправдать использование mysql_fetch_array(). mysql_fetch_array() может быть полезна, если вы выбираете только один столбец.


mysql_fetch_array() vs mysql_fetch_assoc()

mysql_fetch_array(): возвращает массив, соответствующий выбранной строке, и перемещает указатель внутренних данных вперед. для лучшей документации нажмите здесь! узнать больше mysql_fetch_assoc(): эквивалентно вызову mysql_fetch_array() с MYSQL_ASSOC для необязательного второго параметра. Он возвращает только ассоциативный массив.

licensed under cc by-sa 3.0 with attribution.