Как запросы базы данных PHP/MySQL работают точно?

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

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

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

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

Кроме того, если я нумерую страницы ПРЕДЕЛ использования, он содержит ТОТ исходный (старый) результат, даже если база данных обновляется?

5
задан Peter Mortensen 3 December 2010 в 13:36
поделиться

4 ответа

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

Подумайте о последовательности следующим образом:

  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 ) с разными параметрами - это один запрос, и его нужно планировать только один раз (по крайней мере, пока он не выпадет из кеша запросов).

9
ответ дан 18 December 2019 в 09:49
поделиться

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

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

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

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

Если вам нужен только один столбец из базы данных, вы должны ВЫБРАТЬ этот_столбец ИЗ ... . Использование предложения LIMIT также является хорошей идеей, когда это возможно, потому что MySQL обычно может выполнять значительную оптимизацию, если знает, что вам нужна только определенная группа строк.

7
ответ дан 18 December 2019 в 09:49
поделиться

На первый вопрос можно ответить, прочитав ресурсы

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

1
ответ дан 18 December 2019 в 09:49
поделиться

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

0
ответ дан 18 December 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: