2010-02-07 2 views
5

Я много использовал MySQL, но я всегда задавался вопросом, как это работает - когда я получаю положительный результат, где хранятся данные точно? Например, я пишу так:Как выполняются запросы базы данных PHP/MySQL?

$sql = "SELECT * FROM TABLE"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_object($result)) { 
    echo $row->column_name; 
} 

Когда результат возвращается, я предполагаю, что она держит все результаты данных или не возвращает в виде фрагмента и только возвращается, где он просил, как $ row- > column_name?

Или он действительно возвращает каждую строку данных, даже если вам нужен только один столбец в $ result?

Кроме того, если я использую paginate using LIMIT, он сохраняет этот оригинальный (старый) результат, даже если база данных обновлена?

ответ

8

Детали зависят от реализации, но обычно говоря, результаты буферизированы. Выполнение запроса к базе данных приведет к возврату некоторого набора результатов. Если он достаточно мал, все результаты могут быть возвращены с помощью начального вызова или некоторые из них могут быть получены, и при возврате результата в результат объекта возвращается больше результатов.

Think последовательности таким образом:

  1. Вы открываете соединение с базой данных;
  2. Возможно, есть второй вызов для выбора базы данных, или это может быть сделано как часть (1);
  3. Этот шаг аутентификации и подключения (по крайней мере) один раунд на сервер (игнорирование постоянных соединений);
  4. Выполнение запроса на клиенте;
  5. Этот запрос отправляется на сервер;
  6. Сервер должен определить, как выполнить запрос;
  7. Если сервер ранее выполнил запрос, план выполнения все еще может находиться в кеше запросов. Если не нужно создавать новый план;
  8. Сервер выполняет запрос как заданный и возвращает результат клиенту;
  9. Этот результат будет содержать некоторый буфер строк, зависящий от реализации. Это может быть 100 строк или больше или меньше. Все столбцы возвращаются для каждой строки;
  10. Как только вы выберете больше строк, клиент запросит у сервера больше строк. Это может быть, когда клиент заканчивается, или это может быть сделано превентивно. Опять же, это зависит от реализации.

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

Предложения LIMIT - или любое предложение на самом деле - изменят набор результатов.

И, наконец, (7) важно, потому что SELECT * FROM table WHERE a = 'foo' и SELECT * FROM table WHERE a = 'bar' являются двумя различными запросами в отношении оптимизатора базы данных, поэтому план выполнения должен быть определен для каждого отдельно. Но параметризованный запрос (SELECT * FROM table WHERE a = :param) с разными параметрами - это один запрос и его нужно планировать только один раз (по крайней мере, пока он не выпадет из кэша запросов).

+0

Я никогда не понимал слишком много о том, как работают параметризованные запросы. Является обычным способом выполнения параметризованного запроса для отправки команды SELECT * FROM WHERE a =: param' в механизм базы данных вместе с параметрами? Я думал, что ': param' будет заменен значением на стороне клиента. – jnylen

+0

Параметрированный запрос (возможно, преобразованный из клиентской библиотеки в то, что понимает база данных) вместе с параметром, отправляется в базу данных. – cletus

1

Первый вопрос можно ответить, читая на resources

Поскольку вы выбираете «*», каждый столбец возвращается для каждого mysql_fetch_object вызова. Просто посмотрите на print_r ($ row), чтобы увидеть.

+1

«Каждая строка возвращается для каждого вызова mysql_fetch_object»? Конечно, вы имеете в виду каждую колонку. – jnylen

7

Я думаю, вы смешиваете два типа переменных, с которыми имеете дело, и ни один ответ на самом деле не разъясняет, что до сих пор.

$result - объект результата MySQL. Он не содержит никаких строк. Когда вы говорите $result = mysql_query($sql), MySQL выполняет запрос и знает, какие строки будут совпадать, но данные не были перенесены на сторону PHP. $result можно рассматривать как указатель на запрос, который вы запросили MySQL.

Когда вы говорите $row = mysql_fetch_object($result), тогда PHP-интерфейс PHP получает строку для вас. Только эта строка помещается в $row (как простой старый объект PHP, но вы можете использовать другую функцию выборки, чтобы запросить ассоциативный массив или конкретные столбцы из каждой строки.)

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

Если вам нужен только один столбец из базы данных, тогда вы должны SELECT that_column FROM .... Использование предложения LIMIT также является хорошей идеей, когда это возможно, потому что MySQL обычно может выполнять значительную оптимизацию, если знает, что вам нужна только определенная группа строк.

0

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