![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
godsgame |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 29.8.2005 Репутация: нет Всего: нет |
mysql_num_rows И SELECT COUNT(*)
в чем разница, что работает быстрее? Это сообщение отредактировал(а) godsgame - 24.7.2006, 17:55 |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
разница в том, что mysql_num_rows - это функция PHP, а "SELECT COUNT(*)" - конструкция запроса MySQL. Если ты делаешь запрос, буфферизируешь результат его выполнения(!!!) , а потом уже средствами PHP считаешь, сколько же там строк, в буфере, то, как на меня, сделать запрос СУБД на подсчёт количества строк, попадающих под условие, будет быстрее. Вот намного ли - не знаю. Но это то же самое(почти), что принять все строки для того, чтоб посчитать, сколько строк в таблице.
Добавлено @ 18:07 касательно "функции PHP" - это я слегка погорячился. Языков не много знаю даже на уровне синтаксиса, может имелся в виду какой-то другой... |
|||
|
||||
godsgame |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 29.8.2005 Репутация: нет Всего: нет |
skyboy,
я просто в общем виде написал. Вообще когда у меня идет выборка и нужно еще узнать сколько этих записей я просто завожу переменную и увеличиваю ее в цикле каждый раз на 1, в результате она является кол-вом записей. Спасибо за исчерпывающий ответ. Вывод: когда нужно узнать ТОЛЬКО кол-во записей SELECT COUNT(*) подойдет как нельзя лучше, в остальных случаях, где возвращается результат запроса, я советую инкремент. Это сообщение отредактировал(а) godsgame - 24.7.2006, 18:15 |
|||
|
||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
это уже где-то обсуждалось... и много спорили по этому поводу. Кажется пришли к мнению, что пофиг как считать сколько записей
![]() я лично делаю всегда так без всякого COUNT
... и даже не представляю какую нужно таблицу иметь чтоб тормоза почувствовать )))) -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
godsgame |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 29.8.2005 Репутация: нет Всего: нет |
Gold Dragon,
учту |
|||
|
||||
Drache |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 31.3.2006 Репутация: 1 Всего: 3 |
во-первых, все не так просто.
count(*) берется из инфы про саму таблицу, т.е. мускуль не считает кол-во выбранных строк, он вообще в таблицу не заглядывает на ее строки, это значение пишется отдельно. Поэтому работает быстрее для того, чтоб узнать кол-во строк. Но и не всегда подходит. Потому что если выборка делается с условием, то выбаст не тот результат. Если нужно узнать кол-во строк результата юзайте пхпшную ф-цию mysql_num_rows(). И вообще там много нюансов есть, почитайте мануал лучше по мускулю. |
|||
|
||||
ZlojEzh |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.10.2005 Где: Киев, Украина Репутация: нет Всего: 15 |
народ, вы издеваетесь?.. считать количество строк в полной выборке, вместо того, чтобы использовать count - это по меньшей мере безграмотно чтоб не быть голословным, провел тестирование (не поленился ж...)
вот что у меня получилось
в таблице - 50 полей и, как видим из результата, 3495 записей и уже при этом получаем разницу в скорости работы больше чем в 200 раз а если вспомнить про постраничную навигацию: получается для вывода списка страниц надо выбирать все записи? а потом отображать только те, что на текущей странице должны быть?... не, ну это ж несерьезно... задумайтесь, люди... |
||||||||
|
|||||||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Простите, вы о чем?
Это принципиально разные вещи. Они дают одинаковое число, только в том случае, если mysql_num_rows вызывается после того, как была выбрана вся таблица и нет группировки. Если же в запросе есть группировка и COUNT, то результат будет разный.
пол миллиона, вполне должно хватить, чтоб почувствовать разницу, особенно если там килобайтные блобы. Вообще изначально - это ф-ция C API MySQL, но чтоб не путаться, в PHP она именуется также. -------------------- Теперь при чем :P |
|||
|
||||
skyboy |
|
||||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
не.
берёт информацию из information_schema. Не знаю, кто тебе сказал, и какой версией сервера ты пользуешься, что У меня же простое выражение
даёт одно значение(=2), а
другое значение(=0). И в этом, как мне кажется, нет ничего удивительного. ![]() Кроме того, правда это не имеет прямого отношения к сабжу, при помощи count(имя_столбца) можно посчитать количество значений в указанном столбце, игнорируя null. Даже если забыть(забить?) про скорость, то функциональность count в MySQL выше функциональности mysql_num_rows в PHP. |
||||||
|
|||||||
Gold Dragon |
|
|||
![]() Призрачный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6753 Регистрация: 1.3.2004 Где: Россия, Тамбов Репутация: 2 Всего: 71 |
ZlojEzh, ну конечно ты прав что так не правильно делать, если есть специальная функция...
Но просто подсчёт количества без условий или без выборки не так уж и часто делается... ![]() Кстати, покопался в документации по MySQL и там говориться, что работа оператора COUNT(*) оптимизирована в расчете на быстрый возврат результатов, если оператор SELECT берет данные из одной таблицы, не используя никаких других столбцов и выражения WHERE. Т.е. если запрос не выглядит так elect count(*) from table, то скорость не гарантирована. Это сообщение отредактировал(а) Gold Dragon - 25.7.2006, 10:30 -------------------- Нельзя жить в прошлом, оно уже прошло. Нельзя жить в будущем, оно ещё не наступило. Нужно жить в настоящем, помня прошлое и думая о будущем! |
|||
|
||||
st0neC0ld |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 4.8.2006 Репутация: нет Всего: нет |
а если делать выборку только по индексу?
SELECT COUNT(id) from table; не спасет? ведь * - все поля(столбцы) выбираются.. или я не прав? |
|||
|
||||
Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Не-а. Разницы 0. индексы быстрее при поиске строк, а если выбираются все строки из таблицы, то индекс не используется. -------------------- Теперь при чем :P |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |