С нами с 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(*) по огромной таблице - это ресурсозатратно.
Есть ли более короткий и быстрый способ посчитать кол-во элементов?
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 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) и другие попытки сделать это менее ресурсоемким делать нет смысла.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 08/09/06 в 18:41 |
Есть правила ANSI SQL с рекомендациями по синтаксису запросов, думаю их и надо придерживатся.
MySQL от версии к версии меняет свой sql парсер, и что быстро на одной версии работает медленно на другой, может быть и наоборот, а может вообще не работать с новой версией.
Вобщем мое лично мнение, лучше стандарта придерживатся.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
0
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 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(*), иначе мускуль проигнорирует индекс таблицы.
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 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" и будет он гламурно все считать, этот вариант лучше всех, если правильно сделан индекс.
|
|
|
|
Текстовая реклама в форме ответа Заголовок и до четырех строчек текста Длина текста до 350 символов Купить рекламу в этом месте! |