Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: select count
 
 автор: ladan   (10.06.2012 в 02:59)   письмо автору
 
 

Доброй ночи!

Когда нужно просто посчитать кол-во записей в таблице, какая ниже запись будет быстрей это делать?


SELECT COUNT(*) FROM table

или

SELECT COUNT(id) FROM table


или без разницы?

  Ответить  
 
 автор: Sfinks   (10.06.2012 в 08:03)   письмо автору
 
   для: ladan   (10.06.2012 в 02:59)
 

без разницы

  Ответить  
 
 автор: ladan   (10.06.2012 в 11:09)   письмо автору
 
   для: Sfinks   (10.06.2012 в 08:03)
 

спасибо!

  Ответить  
 
 автор: Саня   (13.06.2012 в 20:34)   письмо автору
 
   для: ladan   (10.06.2012 в 02:59)
 

Разница есть.
COUNT(выражение) подсчитывает сколько раз результат выражения имеет значение не NULL.
Если же mysql знает, что выражение в аргументе COUNT никогда не станет NULL, то подсчитывается количество строк в результирующем наборе.
Разница неочевидна с первого взгляда, но она есть и результат может получиться не таким как ожидалось.

Если в вашем примере поле id может принимать NULL, то в результате не будут учтены строки у которых id=NULL. Наверняка это не то, что вы хотели получить. Если же id - PRIMARY KEY, то по сути COUNT(id) отработает точно так же как COUNT(*).

Подстава может оказаться в самом неожиданном месте — COUNT по NULLABLE полю с UNIQUE индексом. UNIQUE не ограничивает количество записей со значением NULL.

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

  Ответить  
 
 автор: Sfinks   (14.06.2012 в 12:15)   письмо автору
 
   для: Саня   (13.06.2012 в 20:34)
 

По-моему вопрос был о скорости отработки и под id в данном случае (между строк) подразумевался именно PRIMARY KEY. А что count может возвращать не только количество строк - это и так ясно.

  Ответить  
 
 автор: Саня   (14.06.2012 в 13:48)   письмо автору
 
   для: Sfinks   (14.06.2012 в 12:15)
 

Что там между строк подразумевал автор мы знать не можем и гадать не будем.
А по скорости COUNT(*) будет быстрее, из-за того что над каждым значением проверок на NULL не выполняется.

  Ответить  
 
 автор: Sfinks   (14.06.2012 в 22:19)   письмо автору
 
   для: Саня   (14.06.2012 в 13:48)
 

По логике так и есть.
А на практике нет никакой разницы:
mysql> SET profiling=1;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from files_views;
+----------+
| count(*) |
+----------+
|   103379 |
+----------+
1 row in set (0.00 sec)

mysql> SHOW PROFILE;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000065 |
| checking permissions | 0.000006 |
| Opening tables       | 0.000010 |
| System lock          | 0.000004 |
| Table lock           | 0.000007 |
| init                 | 0.000011 |
| optimizing           | 0.000005 |
| executing            | 0.000088 |
| end                  | 0.000002 |
| end                  | 0.000001 |
| query end            | 0.000002 |
| freeing items        | 0.000006 |
| closing tables       | 0.000003 |
| logging slow query   | 0.000001 |
| cleaning up          | 0.000002 |
+----------------------+----------+
15 rows in set (0.02 sec)

mysql> select count(id) from files_views;
+-----------+
| count(id) |
+-----------+
|    103379 |
+-----------+
1 row in set (0.00 sec)

mysql> SHOW PROFILE;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000071 |
| checking permissions | 0.000008 |
| Opening tables       | 0.000011 |
| System lock          | 0.000004 |
| Table lock           | 0.000007 |
| init                 | 0.000015 |
| optimizing           | 0.000004 |
| executing            | 0.000087 |
| end                  | 0.000003 |
| end                  | 0.000004 |
| query end            | 0.000002 |
| freeing items        | 0.000006 |
| closing tables       | 0.000004 |
| logging slow query   | 0.000001 |
| cleaning up          | 0.000020 |
+----------------------+----------+
15 rows in set (0.00 sec)
В обоих случаях сумма 0,000247 секунды.

И обратите внимание на строку "optimizing". Вот в этот момент и определяется, что id - это PRIMARY KEY и никаких проверок на NULL не производится.

  Ответить  
 
 автор: Саня   (14.06.2012 в 23:50)   письмо автору
 
   для: Sfinks   (14.06.2012 в 22:19)
 

На таких смешных объёмах (особенно без параллельных конкурентных запросов) разницы конечно же нет. Ну во всяком случае она может быть в пределах погрешности измерений.

> А на практике нет никакой разницы:
Оптимизатор mysql вполне способен определить необходимость конвертирования выражения COUNT(выражение) в COUNT(*). Это особенно очевидно для PRIMARY KEY столбцов. Поэтому ничего удивительного и примечательного в ваших тестах я не вижу.

> По логике так и есть.
> А на практике нет никакой разницы:
Разница есть. Просто она аукнется позже — когда объёмы данных и нагрузка значительно вырастет.

  Ответить  
 
 автор: Sfinks   (16.06.2012 в 02:32)   письмо автору
 
   для: Саня   (14.06.2012 в 23:50)
 

Вы уже сами себе противоречите. Не вижу смысла продолжать дискуссию.

  Ответить  
 
 автор: Саня   (16.06.2012 в 09:21)   письмо автору
 
   для: Sfinks   (16.06.2012 в 02:32)
 

Вы кажется не поняли какую мысль я попытался донести. Не вижу смысла продолжать дискуссию.

  Ответить  
 
 автор: ladan   (14.06.2012 в 21:56)   письмо автору
 
   для: Саня   (13.06.2012 в 20:34)
 

Объясните плз в чем разница Primary key, Index, Unique и Full Text? И зачем нужен Null?(при редактировании какой-нибудь ячейки можно галочку поставить)

  Ответить  
 
 автор: Sfinks   (14.06.2012 в 22:24)   письмо автору
 
   для: ladan   (14.06.2012 в 21:56)
 

А какая разница между яйцом и молоком? Еда же =)))

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

  Ответить  
 
 автор: ladan   (15.06.2012 в 02:18)   письмо автору
 
   для: Sfinks   (14.06.2012 в 22:24)
 

Хорошо, почитаю когда-нибудь :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования