Я использовал MySQL много, но я всегда задавался вопросом точно, как он работает - когда я получаю положительный результат, где данные хранятся точно? Например, я пишу как это:
$sql = "SELECT * FROM TABLE";
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result)) {
echo $row->column_name;
}
Когда результат возвращается, я предполагаю, что он содержит все результаты данных, или он возвращается во фрагменте и только возвращается, где относительно него просят, как $row-> column_name?
Или это действительно возвращает каждую строку данных, даже если Вы только хотели один столбец в $result?
Кроме того, если я нумерую страницы ПРЕДЕЛ использования, он содержит ТОТ исходный (старый) результат, даже если база данных обновляется?
Детали зависят от реализации, но в целом, говоря, результаты буферизуются. Выполнение запроса к базе данных вернет некоторый набор результатов. Если он достаточно мал, все результаты могут быть возвращены при первоначальном вызове или некоторые из них могут быть возвращены, и при итерации по объекту результата возвращается больше результатов.
Подумайте о последовательности следующим образом:
Идея всего этого состоит в том, чтобы минимизировать количество обращений к серверу и не отправлять обратно слишком много ненужных данных, поэтому, если вы запросите миллион строк, вы не получите их все сразу.
Предложения LIMIT - или фактически любые предложения - изменяют набор результатов.
Наконец, (7) важно, потому что SELECT * FROM table WHERE a = 'foo'
и SELECT * FROM table WHERE a = 'bar'
- это два разных запроса. Что касается оптимизатора базы данных, то план выполнения должен определяться для каждого отдельно. Но параметризованный запрос ( SELECT * FROM table WHERE a =: param
) с разными параметрами - это один запрос, и его нужно планировать только один раз (по крайней мере, пока он не выпадет из кеша запросов).
Я думаю, вы путаете два типа переменных, с которыми имеете дело, и ни один из ответов пока не проясняет это.
$ result
- объект результата MySQL. Он не «не содержит строк». Когда вы говорите $ result = mysql_query ($ sql)
, MySQL выполняет запрос и знает, какие строки будут соответствовать, но данные не были переданы стороне PHP. $ result
можно рассматривать как указатель на запрос, который вы просили выполнить MySQL.
Когда вы говорите $ row = mysql_fetch_object ($ result)
, это означает, что интерфейс PHP MySQL получает строку для вас.Только эта строка помещается в $ row
(как обычный старый объект PHP, но вы можете использовать другую функцию выборки, чтобы запросить ассоциативный массив или определенные столбцы из каждой строки.)
Строки могут быть помещены в буфер с расчетом на то, что вы будете извлекать все строки в плотном цикле (что обычно и имеет место), но обычно строки извлекаются, когда вы запрашиваете их с помощью одного из mysql_fetch_ *
функций.
Если вам нужен только один столбец из базы данных, вы должны ВЫБРАТЬ этот_столбец ИЗ ...
. Использование предложения LIMIT
также является хорошей идеей, когда это возможно, потому что MySQL обычно может выполнять значительную оптимизацию, если знает, что вам нужна только определенная группа строк.
На первый вопрос можно ответить, прочитав ресурсы
Поскольку вы ВЫБИРАЕТЕ «*», каждый столбец возвращается для каждого mysql_fetch_object вызов. Просто посмотрите на print_r ($ row), чтобы увидеть.
Простыми словами, ресурс вернул его как идентификатор, который библиотека MySQL ассоциирует с другими данными. Я думаю, что это как идентификационная карта в вашем кошельке, это просто номер и некоторая информация, но связана с большим количеством дополнительной информации, если вы дадите ее правительству, или вашей компании сотовой связи, и т.д..