| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > mysql_num_rows И SELECT COUNT(*) |
| Автор: godsgame 24.7.2006, 17:54 |
| mysql_num_rows И SELECT COUNT(*) в чем разница, что работает быстрее? |
| Автор: skyboy 24.7.2006, 18:05 |
| разница в том, что mysql_num_rows - это функция PHP, а "SELECT COUNT(*)" - конструкция запроса MySQL. Если ты делаешь запрос, буфферизируешь результат его выполнения(!!!) , а потом уже средствами PHP считаешь, сколько же там строк, в буфере, то, как на меня, сделать запрос СУБД на подсчёт количества строк, попадающих под условие, будет быстрее. Вот намного ли - не знаю. Но это то же самое(почти), что принять все строки для того, чтоб посчитать, сколько строк в таблице. Добавлено @ 18:07 касательно "функции PHP" - это я слегка погорячился. Языков не много знаю даже на уровне синтаксиса, может имелся в виду какой-то другой... |
| Автор: godsgame 24.7.2006, 18:11 |
| skyboy, я просто в общем виде написал. Вообще когда у меня идет выборка и нужно еще узнать сколько этих записей я просто завожу переменную и увеличиваю ее в цикле каждый раз на 1, в результате она является кол-вом записей. Спасибо за исчерпывающий ответ. Вывод: когда нужно узнать ТОЛЬКО кол-во записей SELECT COUNT(*) подойдет как нельзя лучше, в остальных случаях, где возвращается результат запроса, я советую инкремент. |
| Автор: Gold Dragon 24.7.2006, 18:54 | ||
| это уже где-то обсуждалось... и много спорили по этому поводу. Кажется пришли к мнению, что пофиг как считать сколько записей я лично делаю всегда так без всякого COUNT
... и даже не представляю какую нужно таблицу иметь чтоб тормоза почувствовать )))) |
| Автор: godsgame 24.7.2006, 19:25 |
| Gold Dragon, учту |
| Автор: Drache 25.7.2006, 08:09 |
| во-первых, все не так просто. count(*) берется из инфы про саму таблицу, т.е. мускуль не считает кол-во выбранных строк, он вообще в таблицу не заглядывает на ее строки, это значение пишется отдельно. Поэтому работает быстрее для того, чтоб узнать кол-во строк. Но и не всегда подходит. Потому что если выборка делается с условием, то выбаст не тот результат. Если нужно узнать кол-во строк результата юзайте пхпшную ф-цию mysql_num_rows(). И вообще там много нюансов есть, почитайте мануал лучше по мускулю. |
| Автор: Ignat 25.7.2006, 09:59 | ||
| Простите, вы о чем? Это принципиально разные вещи. Они дают одинаковое число, только в том случае, если mysql_num_rows вызывается после того, как была выбрана вся таблица и нет группировки. Если же в запросе есть группировка и COUNT, то результат будет разный.
пол миллиона, вполне должно хватить, чтоб почувствовать разницу, особенно если там килобайтные блобы. Вообще изначально - это ф-ция C API MySQL, но чтоб не путаться, в PHP она именуется также. |
| Автор: skyboy 25.7.2006, 10:06 | ||||||
не.
берёт информацию из information_schema. Не знаю, кто тебе сказал, и какой версией сервера ты пользуешься, что У меня же простое выражение
даёт одно значение(=2), а
другое значение(=0). И в этом, как мне кажется, нет ничего удивительного. Кроме того, правда это не имеет прямого отношения к сабжу, при помощи count(имя_столбца) можно посчитать количество значений в указанном столбце, игнорируя null. Даже если забыть(забить?) про скорость, то функциональность count в MySQL выше функциональности mysql_num_rows в PHP. |
| Автор: Gold Dragon 25.7.2006, 10:26 |
| ZlojEzh, ну конечно ты прав что так не правильно делать, если есть специальная функция... Но просто подсчёт количества без условий или без выборки не так уж и часто делается... Кстати, покопался в документации по MySQL и там говориться, что работа оператора COUNT(*) оптимизирована в расчете на быстрый возврат результатов, если оператор SELECT берет данные из одной таблицы, не используя никаких других столбцов и выражения WHERE. Т.е. если запрос не выглядит так elect count(*) from table, то скорость не гарантирована. |
| Автор: st0neC0ld 4.8.2006, 13:00 |
| а если делать выборку только по индексу? SELECT COUNT(id) from table; не спасет? ведь * - все поля(столбцы) выбираются.. или я не прав? |
| Автор: Ignat 4.8.2006, 13:46 |
Не-а. Разницы 0. индексы быстрее при поиске строк, а если выбираются все строки из таблицы, то индекс не используется. |