Ниже приведены два метода, которые обычно используются в большинстве php-кодов для получения данных mysql.
mysql_fetch_array()
mysql_fetch_assoc()
Теперь у меня большая база данных. Для получения данных в циклах ( while
), что быстрее и лучше?
Я нашел этот ориентир .
Каков ваш выбор?
Это зависит от того, как настроены ваши таблицы:
mysql_fetch_array()
существу возвращает два массива с числовым индексом, один с ассоциативным строковым индексом.
Таким образом, используя mysql_fetch_array()
без указания MYSQL_ASSOC
или MYSQL_NUM
, или указав MYSQL_BOTH
, вернет два массива (в основном, что mysql_fetch_assoc()
и mysql_fetch_row()
вернутся), так что mysql_fetch_assoc()
выполняется быстрее.
Если у вас есть правильная настройка таблицы и правильно написанный запрос, то mysql_fetch_assoc()
– это путь, читаемость кода wise $result['username']
легче понять, чем $result[0]
.
Я предпочитаю fetch_assoc. Он возвращает «ассоциативный массив» (например, словарь python). Это означает, что ваш массив индексируется строкой (в моем обычном случае).
Значение по умолчанию для fetch_array дает как нумерованные индексы, так и ассоциативные индексы.
Но я никогда не использую нумерованные индексы, поэтому мне нравится немного быстрее, чем fetch_assoc
В тестовом примере, показанном в вашем примере, используется mysql_fetch_array () без каких-либо аргументов для указания MYSQL_ASSOC или MYSQL_NUM, поэтому он по умолчанию имеет значение MYSQL_BOTH … это скорее исказит результат, так как ему потребуется загрузить в два раза больше элементов массива, чем mysql_fetch_assoc (). Поэтому я бы предположил, что это не правильный тест.
На самом деле должно быть очень мало различий между mysql_fetch_array () с MYSQL_ASSOC и mysql_fetch_assoc (), и это не будет самым большим накладным расходами в вашем скрипте.
«Размер» результатов запроса не имеет значения в этом случае.
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
цикла while) это просто не сокращает его. Когда нет необходимости в «быстро извлекаемых» результатах (через оператор list
), и результат должен быть дополнительно обработан в коде, я всегда использую mysql_fetch_assoc()
*.
* При принуждении фактически использовать устаревшие процедурные функции поиска данных PHP. Есть альтернативы .
Это результат mysql_fetch_array ()
$row['fieldname'] = 'some value';
или
$row[0] = some value';
Это результат mysql_fetch_assoc () будет возвращаться только
$row['fieldname'] = 'some value';
mysql_fetch_assoc()
, вероятно, будет лучшим выбором. Существует небольшое повышение производительности (расширение mysql должно искать имена столбцов, но это должно происходить только один раз, независимо от того, сколько строк у вас есть), но, вероятно, недостаточно, чтобы оправдать использование mysql_fetch_array()
. mysql_fetch_array()
может быть полезна, если вы только выбираете один столбец.
Я полагаю, это зависит от вашего определения большого. Из этого теста вы можете видеть, что только до того, как вы произведете более 1 000 000 000 выборок, вы на самом деле получаете измеримую разницу? Является ли ваша база данных такой большой? Если нет, то перейдите к тому, что вам легче использовать (что, вероятно, для получения ассоциативного массива).
Еще один момент, чтобы рассмотреть, если он настолько велик, что есть измеримая разница, тогда я получаю возможность использовать такие функции вместе. Рассмотрите возможность использования MySQLi или даже лучше использовать PDO!
Хорошо http://php.net/manual/en/function.mysql-fetch-assoc.php состояния
Примечание. Производительность
Важно отметить, что использование mysql_fetch_assoc () не значительно медленнее, чем использование mysql_fetch_row (), в то время как оно обеспечивает значительную добавленную стоимость.
Поэтому разница не должна беспокоиться.
Дополнительным моментом, который следует учитывать, является то, что 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()
, вручную fetch_assoc()
столбцы SELECT
, fetch_assoc()
каждому столбцу уникальный псевдоним:
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
по индексу, а не по ключу
mysql_fetch_array () vs mysql_fetch_assoc ()
mysql_fetch_array (): возвращает массив, соответствующий выбранной строке, и перемещает указатель внутренних данных вперед. для лучшей документации нажмите здесь! чтобы узнать больше mysql_fetch_assoc (): эквивалентно вызову mysql_fetch_array () с MYSQL_ASSOC для необязательного второго параметра. Он возвращает только ассоциативный массив.