Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Что быстрее?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Стас
Отправлено: 09 Июня, 2007 - 21:14:06
Post Id


Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007  


Помог: 0 раз(а)

[+]


Предположим, у меня есть таблица. Там две колонки и несколько сторок.
Что быстрее:
PHP:
скопировать код в буфер обмена
  1. $query = mysql_query("SELECT * FROM `table`");
  2. for($i=0; $i<mysql_num_rows($query); $i++) {
  3. // Мне с массивом удобнее
  4. $data[0] = mysql_result($query, $i, 0);
  5. $data[1] = mysql_result($query, $i, 1);
  6. echo $data[0]." - ".$data[1];
  7. }

или же
PHP:
скопировать код в буфер обмена
  1. $query = mysql_query("SELECT * FROM `table`");
  2. for($i=0; $i<mysql_num_rows($query); $i++) {
  3. $dataquery = mysql_query("SELECT * FROM `table` LIMIT $i,1");
  4. $data = mysql_fetch_array($dataquery);
  5. echo $data[0]." - ".$data[1];
  6. }

Или есть более быстрый вариант?

Так что же быстрее?

 
 Top
evgenijj
Отправлено: 10 Июня, 2007 - 00:05:48
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Функция mysql_fetch_array (mysql_fetch_row) работает быстрее mysql_result. В данном случае оба варианта неудачные. Первый - потому что использует mysql_result. Второй - потому что без необходимости использует запрос
$dataquery = mysql_query("SELECT * FROM `table` LIMIT $i,1");
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = mysql_query("SELECT * FROM `table`");
  3. while ( $data = mysql_fetch_array($query) ) {
  4.   echo $data[0]." - ".$data[1];
  5. }
  6.  

Если таблица содержит 10000 записей, то ты 10000 раз делаешь запрос к БД, без всякой необходимости нагружая сервер БД.

Но вообще -- второй вариант не имеет смысла -- в цикле выполняется запрос
SELECT * FROM `mytable` LIMIT $i, 1;
Поскольку запрос не содержит ORDER BY будут возвращаться СЛУЧАЙНЫЕ записи.

И еще -- не слишком удачная идея использовать внутри цикла функцию mysql_num_rows(). Было бы логичнее один раз вычислить количество строк результата, а не вычислять его 10000 раз.

Подводя итог -- ты сделал все, чтобы без всякой необходимости по максимуму нагрузить интерпретатор PHP и сервер БД.
 
 Top
Стас
Отправлено: 10 Июня, 2007 - 08:50:05
Post Id


Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007  


Помог: 0 раз(а)

[+]


Не понял Работает... но до меня не доходит - как?
 
 Top
evgenijj
Отправлено: 10 Июня, 2007 - 09:41:55
Post Id



Участник


Покинул форум
Сообщений всего: 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 и мы выходим из цикла)
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT id, name, email FROM `users` ORDER BY name";
  3. $res = mysql_query( $query );
  4. echo "<table border='1'>";
  5. echo "<tr><th>ID</th><th>Имя</th><th>E-mail</th></tr>";
  6. while ( $user = mysql_fetch_array($res) )
  7. {  
  8.   echo "<tr>";
  9.   echo "<td>" . $user["id"] . "</td><td>" . $user["name"] . "</td><td>" . $user["email"] . "</td>";
  10.   echo "</tr>";  
  11. }
  12. echo "</table>";
  13.  

Или так
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT id, name, email FROM `users` ORDER BY name";
  3. $res = mysql_query( $query );
  4. echo "<table border='1'>";
  5. echo "<tr><th>ID</th><th>Имя</th><th>E-mail</th></tr>";
  6. while ( $user = mysql_fetch_array($res) )
  7. {  
  8.   echo "<tr>";
  9.   echo "<td>" . $user[0] . "</td><td>" . $user[1] . "</td><td>" . $user[2] . "</td>";
  10.   echo "</tr>";  
  11. }
  12. echo "</table>";
  13.  

 
 Top
Стас
Отправлено: 10 Июня, 2007 - 11:43:09
Post Id


Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007  


Помог: 0 раз(а)

[+]


Ясно... спасибо! Не знал про то, что новую строку выдаёт при повторном вызове!
 
 Top
Стас
Отправлено: 12 Июня, 2007 - 14:42:34
Post Id


Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007  


Помог: 0 раз(а)

[+]


Что быстрее:

или

Однако
 
 Top
EuGen Администратор
Отправлено: 28 Июня, 2007 - 13:53:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




В первом случае интерпретатор будет вынужден сделать вызов list но зато во втором выбираются все поля из таблицы без каких-либо условий! Это значит, что если таблица скажем пару миллионов строк и содержит один-два атрибута типа text или blob, такой код сильно увеличит нагрузку на сервер БД.
Так что с этой точки зрения, конечно же, 1-й вариант предпочтительнее.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Ivanezko
Отправлено: 14 Октября, 2007 - 11:57:21
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Окт. 2007  


Помог: 0 раз(а)




evgenijj пишет:

Но вообще -- второй вариант не имеет смысла -- в цикле выполняется запрос
SELECT * FROM `mytable` LIMIT $i, 1;
Поскольку запрос не содержит ORDER BY будут возвращаться СЛУЧАЙНЫЕ записи.

Ах как было бы прекрасно если бы это было так!
По моим наблюдениям по умолчанию используется сортировка по основному ключу (обычно это автоинкрементный id).
Возможно и не так, но уж точно не рандомно, увы...
 
 Top
EuGen Администратор
Отправлено: 14 Октября, 2007 - 12:40:34
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Я думаю, сортировка "по умолчанию" есть. Например, в Oracle в любой таблице есть псевдостолбец RowID, который фактически хранит адрес строки. Он есть всегда и по этому имени можно обращаться в запросах. По умолчанию там сортировка идет по этому столбцу. Думаю, что и в mysql есть какое-то подобие этого столбца (другое дело, что я, например, не нашел способа к нему обратиться в запросах).


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB