Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mysql_num_rows И SELECT COUNT(*), в чем разница, что работает быстрее? 
V
    Опции темы
godsgame
Дата 24.7.2006, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 29.8.2005

Репутация: нет
Всего: нет



mysql_num_rows  И SELECT COUNT(*)
в чем разница, что работает быстрее?  

Это сообщение отредактировал(а) godsgame - 24.7.2006, 17:55
PM MAIL   Вверх
skyboy
Дата 24.7.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



разница в том, что mysql_num_rows - это функция PHP, а "SELECT COUNT(*)"  - конструкция запроса MySQL. Если ты делаешь запрос, буфферизируешь результат его выполнения(!!!) , а потом уже средствами PHP считаешь, сколько же там строк, в буфере, то, как на меня, сделать запрос СУБД на подсчёт количества строк, попадающих под условие, будет быстрее. Вот намного ли - не знаю. Но это то же самое(почти), что принять все строки для того, чтоб посчитать, сколько строк в таблице.

Добавлено @ 18:07 
касательно "функции PHP" - это я слегка погорячился. Языков не много знаю даже на уровне синтаксиса, может имелся в виду какой-то другой...  
PM MAIL   Вверх
godsgame
Дата 24.7.2006, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 29.8.2005

Репутация: нет
Всего: нет



skyboy
я просто в общем виде написал. Вообще когда у меня идет выборка и нужно еще узнать сколько этих записей я просто завожу переменную и увеличиваю ее в цикле каждый раз на 1, в результате она является кол-вом записей. Спасибо за исчерпывающий ответ.
Вывод: когда нужно узнать ТОЛЬКО кол-во записей SELECT COUNT(*) подойдет как нельзя лучше, в остальных случаях, где возвращается результат запроса, я советую инкремент.  

Это сообщение отредактировал(а) godsgame - 24.7.2006, 18:15
PM MAIL   Вверх
Gold Dragon
Дата 24.7.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



это уже где-то обсуждалось... и много спорили по этому поводу. Кажется пришли к мнению, что пофиг  как считать сколько записей smile 

я лично делаю всегда так без всякого COUNT
Код

$z = "SELECT * FROM `table`";
$r = mysql_query($z);
i$a = mysql_num_rows($r); // количество записей


... и даже не представляю какую нужно таблицу иметь чтоб тормоза почувствовать )))) 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
godsgame
Дата 24.7.2006, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 29.8.2005

Репутация: нет
Всего: нет



Gold Dragon
учту 
PM MAIL   Вверх
Drache
Дата 25.7.2006, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 31.3.2006

Репутация: 1
Всего: 3



во-первых, все не так просто.
count(*) берется из инфы про саму таблицу, т.е. мускуль не считает кол-во выбранных строк, он вообще в таблицу не заглядывает на ее строки, это значение пишется отдельно. Поэтому работает быстрее для того, чтоб узнать кол-во строк. Но и не всегда подходит. Потому что если выборка делается с условием, то выбаст не тот результат.
Если нужно узнать кол-во строк результата юзайте пхпшную ф-цию mysql_num_rows().
И вообще там много нюансов есть, почитайте мануал лучше по мускулю. 
PM MAIL   Вверх
ZlojEzh
Дата 25.7.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: нет
Всего: 15



Цитата(Gold Dragon @  24.7.2006,  18:54 Найти цитируемый пост)
Кажется пришли к мнению, что пофиг  как считать сколько записей

Цитата(Gold Dragon @  24.7.2006,  18:54 Найти цитируемый пост)
... и даже не представляю какую нужно таблицу иметь чтоб тормоза почувствовать )))) 

народ, вы издеваетесь?..
считать количество строк в полной выборке, вместо того, чтобы использовать count - это по меньшей мере безграмотно
чтоб не быть голословным, провел тестирование (не поленился ж...)

Код

  function microtime_float() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
  }

  $time_start = microtime_float();
  $result = mysql_query("select * from table");
  print "num = ".mysql_num_rows($result)."\n";
  print microtime_float() - $time_start;
  print "\n";


  $time_start = microtime_float();
  $result = mysql_query("select count(*) from table");
  print "num = ".mysql_result($result,0)."\n";
  print microtime_float() - $time_start;
  print "\n";


вот что у меня получилось
Код

num = 3495
0.072111129760742
num = 3495
0.00032496452331543

в таблице - 50 полей и, как видим из результата, 3495 записей
и уже при этом получаем разницу в скорости работы больше чем в 200 раз

а если вспомнить про постраничную навигацию:
получается для вывода списка страниц надо выбирать все записи?
а потом отображать только те, что на текущей странице должны быть?...

не, ну это ж несерьезно...
задумайтесь, люди...

 
PM MAIL ICQ   Вверх
Ignat
Дата 25.7.2006, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Простите, вы о чем?
Это принципиально разные вещи. Они дают одинаковое число, только в том случае, если mysql_num_rows вызывается после того, как была выбрана вся таблица и нет группировки. Если же в запросе есть группировка и COUNT, то результат будет разный.

Цитата(Gold Dragon @  24.7.2006,  19:54 Найти цитируемый пост)
... и даже не представляю какую нужно таблицу иметь чтоб тормоза почувствовать ))))  

пол миллиона, вполне должно хватить, чтоб почувствовать разницу, особенно если там килобайтные блобы.

Цитата(skyboy @  24.7.2006,  19:05 Найти цитируемый пост)
касательно "функции PHP" - это я слегка погорячился. 

Вообще изначально - это ф-ция C API MySQL, но чтоб не путаться, в PHP она именуется также.  


--------------------
Теперь при чем :P
PM   Вверх
skyboy
Дата 25.7.2006, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Drache @  25.7.2006,  08:09 Найти цитируемый пост)
count(*) берется из инфы про саму таблицу

не. 
Код

SELECT count(*) FROM blabla1

берёт информацию из information_schema. Не знаю, кто тебе сказал, и какой версией сервера ты  пользуешься, что 
Цитата(Drache @  25.7.2006,  08:09 Найти цитируемый пост)
если выборка делается с условием, то выбаст не тот результат.

У меня же простое выражение 
Код

SELECT count(*) FROM test WHERE id>5

даёт одно значение(=2), а 
Код

SELECT count(*) FROM test WHERE id>7

другое значение(=0). И в этом, как мне кажется, нет ничего удивительного.  smile 
Кроме того, правда это не имеет прямого отношения к сабжу, при помощи count(имя_столбца) можно посчитать количество значений в указанном столбце, игнорируя null. Даже если забыть(забить?) про скорость, то функциональность count в MySQL выше функциональности mysql_num_rows в PHP.
 
PM MAIL   Вверх
Gold Dragon
Дата 25.7.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 2
Всего: 71



ZlojEzh, ну конечно ты прав что так не правильно делать, если есть специальная функция... 

Но просто подсчёт количества без условий или без выборки не так уж и часто делается... smile  (я про себя говорю)

Кстати, покопался в документации по MySQL и там говориться, что работа оператора COUNT(*) оптимизирована в расчете на быстрый возврат результатов, если оператор SELECT берет данные из одной таблицы, не используя никаких других столбцов и выражения WHERE.  Т.е. если запрос не выглядит так elect count(*) from table, то скорость не гарантирована.   

Это сообщение отредактировал(а) Gold Dragon - 25.7.2006, 10:30


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
st0neC0ld
Дата 4.8.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.8.2006

Репутация: нет
Всего: нет



а если делать выборку только по индексу?

SELECT COUNT(id) from table;

не спасет? ведь * - все поля(столбцы) выбираются.. или я не прав?
PM   Вверх
Ignat
Дата 4.8.2006, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(st0neC0ld @  4.8.2006,  14:00 Найти цитируемый пост)
или я не прав? 

Не-а. Разницы 0. индексы быстрее при поиске строк, а если выбираются все строки из таблицы, то индекс не используется.


--------------------
Теперь при чем :P
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0858 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.