выборка mysql ассоциируется с массивом выборки mysql - PullRequest
10 голосов
/ 03 марта 2012

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

  1. mysql_fetch_array()
  2. mysql_fetch_assoc()

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

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

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

Ответы [ 10 ]

16 голосов
/ 03 марта 2012

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

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].

1 голос
/ 07 мая 2015

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

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

или

$row[0] = some value';

Это результат mysql_fetch_assoc () вернет только

$row['fieldname'] = 'some value';
1 голос
/ 03 марта 2012

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

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

1 голос
/ 03 марта 2012

В этом случае «размер» результатов запроса не имеет значения.

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. Есть альтернативы .

1 голос
/ 03 марта 2012

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

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

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

0 голосов
/ 22 марта 2017

mysql_fetch_array () против mysql_fetch_assoc ()

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

0 голосов
/ 12 августа 2016

Также следует помнить, что 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 по индексу, а не по клавише

0 голосов
/ 13 декабря 2015

скважина http://php.net/manual/en/function.mysql-fetch-assoc.php состояния

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

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

Так что разница не должна беспокоиться.

0 голосов
/ 03 марта 2012

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

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

0 голосов
/ 03 марта 2012

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

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