it-swarm-eu.dev

Co vlastně COUNT (1) počítá?

Možný duplikát:
Jaký je rozdíl mezi výběrem počtu (*) a výběrem počtu (any_non_null_column)?

Slyšel jsem, že se běžně uvádí, že při počítání počtu řádků v dotazu byste neměli provádět COUNT(*), ale měli byste počítat na indexovaném sloupci.

Viděl jsem DBA, když počítám počet řádků, spusťte SELECT COUNT(1) FROM table;.

Co je to 1 v dotazu?

Zkusil jsem zadat další čísla (2, 0, -1) a výsledek je vždy stejný jako při použití 1.

Je to jen zástupce, nikoli seznam konkrétního sloupce, který by se měl počítat?

Existují nějaké rozdíly ve výkonu oproti použití názvu konstanty versus výpis názvu sloupce?

Momentálně používám MySQl 5.1.60.

8
Patrick

pokud zadáte počet (*), počet (1) nebo počet ("test"), získáte stejný výsledek, protože mysql spočítá počet řádků, například:

select count(fieldname) from table;

zobrazí stejný výsledek jako

select count(*) from table;

nebo

select count(1) from table

mysql> select * from language;
+-------------+----------+---------------------+
| language_id | name     | last_update         |
+-------------+----------+---------------------+
|           1 | English  | 2006-02-15 05:02:19 |
|           2 | Italian  | 2006-02-15 05:02:19 |
|           3 | Japanese | 2006-02-15 05:02:19 |
|           4 | Mandarin | 2006-02-15 05:02:19 |
|           5 | French   | 2006-02-15 05:02:19 |
|           6 | German   | 2006-02-15 05:02:19 |
+-------------+----------+---------------------+
6 rows in set (0.00 sec)

mysql> select 1 from language;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
| 1 |
+---+
6 rows in set (0.00 sec)

mysql> select 'anything'from language;
+----------+
| anything |
+----------+
| anything |
| anything |
| anything |
| anything |
| anything |
| anything |
+----------+
6 rows in set (0.00 sec)

mysql> select count(1), count(*), count('anything') from language;
+----------+----------+-------------------+
| count(1) | count(*) | count('anything') |
+----------+----------+-------------------+
|        6 |        6 |                 6 |
+----------+----------+-------------------+
1 row in set (0.00 sec)

výsledkem bude číslo rovné počtu řádků této tabulky.

PROSÍM, ZÍSKEJTE, ŽE NULL POLE NEBUDOU ZAHRNUTY ...

mysql> select original_language_id from film where original_language_id is null;
+----------------------+
| original_language_id |
+----------------------+
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
|                 NULL |
......
|                 NULL |
+----------------------+
1000 rows in set (0.00 sec)

mysql> select count(original_language_id) from film where original_language_id is null;
+-----------------------------+
| count(original_language_id) |
+-----------------------------+
|                           0 |
+-----------------------------+
1 row in set (0.00 sec)

Z TÉTO DŮVODY, POKUD CHCETE POČTOVAT RYCHLOSTI, MYSLÍM, že počet (něco) je dobrá volba

mysql> SELECT COUNT(1) FROM film;
+----------+
| COUNT(1) |
+----------+
|     1000 |
+----------+
1 row in set (0.00 sec)
8
jcho360