|
|
|
| Доброй ночи!
Когда нужно просто посчитать кол-во записей в таблице, какая ниже запись будет быстрей это делать?
SELECT COUNT(*) FROM table
или
SELECT COUNT(id) FROM table
|
или без разницы? | |
|
|
|
|
|
|
|
для: ladan
(10.06.2012 в 02:59)
| | без разницы | |
|
|
|
|
|
|
|
для: Sfinks
(10.06.2012 в 08:03)
| | спасибо! | |
|
|
|
|
|
|
|
для: 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(выражение), иначе это может привести к трудноулавливаемым ошибкам. | |
|
|
|
|
|
|
|
для: Саня
(13.06.2012 в 20:34)
| | По-моему вопрос был о скорости отработки и под id в данном случае (между строк) подразумевался именно PRIMARY KEY. А что count может возвращать не только количество строк - это и так ясно. | |
|
|
|
|
|
|
|
для: Sfinks
(14.06.2012 в 12:15)
| | Что там между строк подразумевал автор мы знать не можем и гадать не будем.
А по скорости COUNT(*) будет быстрее, из-за того что над каждым значением проверок на NULL не выполняется. | |
|
|
|
|
|
|
|
для: Саня
(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 не производится. | |
|
|
|
|
|
|
|
для: Sfinks
(14.06.2012 в 22:19)
| | На таких смешных объёмах (особенно без параллельных конкурентных запросов) разницы конечно же нет. Ну во всяком случае она может быть в пределах погрешности измерений.
> А на практике нет никакой разницы:
Оптимизатор mysql вполне способен определить необходимость конвертирования выражения COUNT(выражение) в COUNT(*). Это особенно очевидно для PRIMARY KEY столбцов. Поэтому ничего удивительного и примечательного в ваших тестах я не вижу.
> По логике так и есть.
> А на практике нет никакой разницы:
Разница есть. Просто она аукнется позже — когда объёмы данных и нагрузка значительно вырастет. | |
|
|
|
|
|
|
|
для: Саня
(14.06.2012 в 23:50)
| | Вы уже сами себе противоречите. Не вижу смысла продолжать дискуссию. | |
|
|
|
|
|
|
|
для: Sfinks
(16.06.2012 в 02:32)
| | Вы кажется не поняли какую мысль я попытался донести. Не вижу смысла продолжать дискуссию. | |
|
|
|
|
|
|
|
для: Саня
(13.06.2012 в 20:34)
| | Объясните плз в чем разница Primary key, Index, Unique и Full Text? И зачем нужен Null?(при редактировании какой-нибудь ячейки можно галочку поставить) | |
|
|
|
|
|
|
|
для: ladan
(14.06.2012 в 21:56)
| | А какая разница между яйцом и молоком? Еда же =)))
По каждому из этих терминов можно если не книгу написать, то уж хорошую статью наверняка.
Я бы посоветовал погуглить и почитать о каждом в отдельности.
Тогда и разницу поймете. | |
|
|
|
|
|
|
|
для: Sfinks
(14.06.2012 в 22:24)
| | Хорошо, почитаю когда-нибудь :) | |
|
|
|