Плохо ли использование PHP-класса для выполнения запросов mysql? - PullRequest
0 голосов
/ 09 января 2010

Я смотрел на некоторые классы-оболочки баз данных (MySQL), многие из них работают так,
1) Запустите SQL-запрос
2) при извлечении ассоциативного массива mysql они сортируют результаты и добавляют их в свой собственный массив
3) тогда вы запускаете класс, как показано ниже, и циклически просматриваете его массив

<?php  
$database = new Database();

$result = $database->query('SELECT * FROM user;');

foreach ($result as $user){
    echo $user->username;
}

?>

Итак, мой вопрос здесь, разве это не хорошо на сайте с высоким трафиком? Я спрашиваю, потому что, насколько я могу судить, mysql возвращает массив, который потребляет память, затем вы создаете новый массив из этого массива и затем циклически проходите через новый массив. Разве это не хорошо или в значительной степени нормально?

Ответы [ 3 ]

3 голосов
/ 09 января 2010

Короткий ответ: это плохо, очень плохо.

Беда в том, что вы платите неприятный удар по производительности (циклы и память!), Дважды повторяя результаты. (что если у вас будет возвращено 1000 строк? вы получите все данные, зациклите 1000 раз, сохраните все в памяти, а затем зациклите их снова).

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

IIRC, PHP не загружает весь набор результатов MySQL в память, в основном, когда вы вызываете mysql_fetch_array, вы запрашиваете следующую строку в наборе, которая загружается только после запроса, поэтому вы вы не платите за использование памяти для полного набора (на стороне PHP), просто запустив оригинальный запрос. Весь результат загружается в память, когда вы используете mysql_query (спасибо VolkerK), но вы все равно платите Стоимость процессора в два раза больше, и это может быть существенным штрафом.

0 голосов
/ 09 января 2010

Этот тип запроса в значительной степени нормальный. Лучше выбирать только строку за раз, если можете, но для обычных небольших наборов данных, которые вы получаете для небольших и постраничных запросов, дополнительное использование памяти не будет иметь большого значения.

SELECT * FROM user, однако, безусловно, может генерировать бесполезно большой набор данных, если у вас много пользователей и много информации в каждой строке пользователя. Постарайтесь свести столбцы и количество выбранных строк к минимуму, информацию, которую вы фактически собираетесь разместить на странице.

0 голосов
/ 09 января 2010

Код в порядке.

foreach () просто перемещает указатель массива на каждом проходе.

Вы можете прочитать все об этом здесь:

http://php.net/foreach

Для более глубокого понимания посмотрите, как работают указатели в C:

http://home.netcom.com/~tjensen/ptr/ch2x.htm

Ничего не копируется, итерация почти всегда выполняется путем увеличения указателей.

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