Реклама на сайте Advertise with us

PHP MySQL: быстро узнать кол-во записей в таблице. Как?

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 03.04.03
Сообщения: 586
Рейтинг: 75

Ссылка на сообщениеДобавлено: 08/09/06 в 16:51       Ответить с цитатойцитата 

Код:
   
        $query = "SELECT COUNT(*) cnt FROM table WHERE condition";
   $res = mysql_query( $query, $dbconnect) or die( __FILE__ . ":" . __LINE__ . htmlspecialchars($query) . ":" . mysql_error());
   $f = mysql_fetch_array($res);
   $number = $f[cnt];


вот думаю, что COUNT(*) по огромной таблице - это ресурсозатратно.

Есть ли более короткий и быстрый способ посчитать кол-во элементов?

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 08/09/06 в 17:00       Ответить с цитатойцитата 

count(primary_key_field) надо делать

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

2
 



С нами с 06.03.03
Сообщения: 1650
Рейтинг: 1096

Ссылка на сообщениеДобавлено: 08/09/06 в 18:09       Ответить с цитатойцитата 

недавно была тема, обсуждали. кто то сказал что COUNT(*) оптимизирован именно для этой цели, поэтому count(primary_key_field) и другие попытки сделать это менее ресурсоемким делать нет смысла.

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 08/09/06 в 18:41       Ответить с цитатойцитата 

Есть правила ANSI SQL с рекомендациями по синтаксису запросов, думаю их и надо придерживатся.

MySQL от версии к версии меняет свой sql парсер, и что быстро на одной версии работает медленно на другой, может быть и наоборот, а может вообще не работать с новой версией.

Вобщем мое лично мнение, лучше стандарта придерживатся.

Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 08/09/06 в 19:33       Ответить с цитатойцитата 

Я наверно внесу в эту дискуссию ясность.
Итак, есть таблица xpl_items (XPower Links, all-sex-links.com). 40k+ тысяч записей. Индекс стоит на поле bot_check. PRIMARY KEY - id.
Мы будет считать выборку по индексированному полю.
Итак

Код:
EXPLAIN SELECT count(*) FROM `xpl_items` WHERE bot_check='y'
Получаем
id      select_type      table      type      possible_keys      key      key_len      ref      rows      Extra
1    SIMPLE    xpl_items    ref    bot_check    bot_check    1    const    23173    Using where; Using index

Как видишь, индекс схавало, поля посчитало.
Теперь попробуем вариант Steka
Код:
EXPLAIN SELECT count( id ) FROM `xpl_items` WHERE bot_check = 'y'
id      select_type      table      type      possible_keys      key      key_len      ref      rows      Extra
1    SIMPLE    xpl_items    ALL    bot_check    NULL    NULL    NULL    20834    Using where

Индекс bot_check НЕ СХАВАЛО. По той простой причине что он заюзал PRIMARY KEY для подсчета столбцов. А больше одного индекса за запрос он кушать не может на одной таблице. Итого получаем, что по условию он обрабатывает без индекса всю таблицу.

Тоже самое мы получаем, когда насильно пытаемся впихнуть ему наш индекс
Код:
EXPLAIN SELECT count( id ) FROM `xpl_items` USE INDEX (bot_check) WHERE bot_check = 'y'
EXPLAIN SELECT count( id ) FROM `xpl_items` FORCE INDEX (bot_check) WHERE bot_check = 'y'

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

Резюмируя. Если идет выборка по WHERE, используйте count(*), иначе мускуль проигнорирует индекс таблицы.

0
 

Криптопохуист

С нами с 05.04.03
Сообщения: 17156
Рейтинг: 6019

Ссылка на сообщениеДобавлено: 08/09/06 в 19:42       Ответить с цитатойцитата 

Disruptor писал:
Код:
   
        $query = "SELECT COUNT(*) cnt FROM table WHERE condition";
   $res = mysql_query( $query, $dbconnect) or die( __FILE__ . ":" . __LINE__ . htmlspecialchars($query) . ":" . mysql_error());
   $f = mysql_fetch_array($res);
   $number = $f[cnt];

вот думаю, что COUNT(*) по огромной таблице - это ресурсозатратно.
Есть ли более короткий и быстрый способ посчитать кол-во элементов?

По теме топика, ты главное индекс правильный сделай для "WHERE condition" и будет он гламурно все считать, этот вариант лучше всех, если правильно сделан индекс.

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »