Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Функция mysql_fetch_array (mysql_fetch_row) работает быстрее mysql_result. В данном случае оба варианта неудачные. Первый - потому что использует mysql_result. Второй - потому что без необходимости использует запрос
$dataquery = mysql_query("SELECT * FROM `table` LIMIT $i,1");
Если таблица содержит 10000 записей, то ты 10000 раз делаешь запрос к БД, без всякой необходимости нагружая сервер БД.
Но вообще -- второй вариант не имеет смысла -- в цикле выполняется запрос
SELECT * FROM `mytable` LIMIT $i, 1;
Поскольку запрос не содержит ORDER BY будут возвращаться СЛУЧАЙНЫЕ записи.
И еще -- не слишком удачная идея использовать внутри цикла функцию mysql_num_rows(). Было бы логичнее один раз вычислить количество строк результата, а не вычислять его 10000 раз.
Подводя итог -- ты сделал все, чтобы без всякой необходимости по максимуму нагрузить интерпретатор PHP и сервер БД.
Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007
Помог: 0 раз(а)
[+]
Работает... но до меня не доходит - как?
evgenijj
Отправлено: 10 Июня, 2007 - 09:41:55
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Стас пишет:
Работает... но до меня не доходит - как?
Цитата:
array mysql_fetch_array ( resource result [, int result_type] )
Каждый новый вызов функции возвращает строку результата запроса к БД в виде массива. Если строк больше нет -- функция возвращает FALSE.
Второй опциональный аргумент result_type в функции mysql_fetch_array() -- константа и может принимать следующие значения: MYSQL_ASSOC, MYSQL_NUM и MYSQL_BOTH. Значением по умолчанию является: MYSQL_BOTH.
Используя MYSQL_BOTH, вы получите массив, состоящий как из ассоциативных индексов, так и из численных. MYSQL_ASSOC вернёт только ассоциативные соответствия (аналогично функции mysql_fetch_assoc() и MYSQL_NUM только численные (аналогично функции mysql_fetch_row()).
Пример использования (цикл while выполняется, пока условие истино; если все записи результата запроса закончились - функция mysql_fetch_array возвращает FALSE и мы выходим из цикла)
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
В первом случае интерпретатор будет вынужден сделать вызов list но зато во втором выбираются все поля из таблицы без каких-либо условий! Это значит, что если таблица скажем пару миллионов строк и содержит один-два атрибута типа text или blob, такой код сильно увеличит нагрузку на сервер БД.
Так что с этой точки зрения, конечно же, 1-й вариант предпочтительнее.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Ivanezko
Отправлено: 14 Октября, 2007 - 11:57:21
Новичок
Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2007
Помог: 0 раз(а)
evgenijj пишет:
Но вообще -- второй вариант не имеет смысла -- в цикле выполняется запрос
SELECT * FROM `mytable` LIMIT $i, 1;
Поскольку запрос не содержит ORDER BY будут возвращаться СЛУЧАЙНЫЕ записи.
Ах как было бы прекрасно если бы это было так!
По моим наблюдениям по умолчанию используется сортировка по основному ключу (обычно это автоинкрементный id).
Возможно и не так, но уж точно не рандомно, увы...
EuGen
Отправлено: 14 Октября, 2007 - 12:40:34
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Я думаю, сортировка "по умолчанию" есть. Например, в Oracle в любой таблице есть псевдостолбец RowID, который фактически хранит адрес строки. Он есть всегда и по этому имени можно обращаться в запросах. По умолчанию там сортировка идет по этому столбцу. Думаю, что и в mysql есть какое-то подобие этого столбца (другое дело, что я, например, не нашел способа к нему обратиться в запросах).
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.