Understanding COUNT(id) vs. COUNT(*) and MySQL Query Optimization

Vipul Vyas
3 min readSep 19, 2023

--

In MySQL, `COUNT(id)` and `COUNT(*)` are powerful tools to retrieve the number of rows that meet specific conditions. Sometimes, the MySQL optimizer may leverage an index, even when counting rows, to improve performance.

⚙️ Employee Table Structure:
The ‘employee’ table structure typically includes essential information about employees, such as name, id, and joining date. Here’s a simplified example of an employee table:
index: id, joining_date

| id | name | joining_date | …other columns… |
| — — | — — — — — — — -| — — — — — — — | — — — — — — — — — -|
| 1. | employee one | 2022–01–15 | … |
| 2. | employee two | 2022–02–20 | … |

1️⃣ COUNT(id):
The `COUNT(id)` function counts the number of non-null values in the ‘id’ column. In some cases, MySQL might utilize an index, such as ‘joining_date,’ to efficiently count the rows based on the criteria specified.

Example Query:
EXPLAIN SELECT COUNT(id) FROM employee;

Output:
+ — — + — — — — — — -+ — — — — — + — — — — — — + — — — -+ — — — — — — — -+ — — — — — -+ — — — — -+ — — — + — — — -+ — — — — — + — — — — — — -+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ — — + — — — — — — -+ — — — — — + — — — — — — + — — — -+ — — — — — — — -+ — — — — — -+ — — — — -+ — — — + — — — -+ — — — — — + — — — — — — -+
| 1 | SIMPLE | employee | NULL | index | NULL | joining_date | 8 | NULL | 100 | 100.00 | Using index |

2️⃣ COUNT(*):
The `COUNT(*)` counts the total number of rows in the specified table. Similar to `COUNT(id)`, MySQL may utilize an index if it deems it beneficial for efficient retrieval of row counts.

Example Query:
EXPLAIN SELECT COUNT(*) FROM employee;

Output:
+ — — + — — — — — — -+ — — — — — + — — — — — — + — — — -+ — — — — — — — -+ — — — — — -+ — — — — -+ — — — + — — — -+ — — — — — + — — — — — — -+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ — — + — — — — — — -+ — — — — — + — — — — — — + — — — -+ — — — — — — — -+ — — — — — -+ — — — — -+ — — — + — — — -+ — — — — — + — — — — — — -+
| 1 | SIMPLE | employee | NULL | index | NULL | joining_date | 8 | NULL | 100 | 100.00 | Using index |

⚙️ Query Optimization:
MySQL’s optimizer is designed to make efficient choices based on the available indexes and data distribution. If an index, like ‘joining_date,’ is present and can aid in speeding up the query, MySQL may choose to utilize it for faster row counting.

Understanding how MySQL leverages indexes for various operations, including counting rows, is crucial for optimizing query performance and ensuring the database operates efficiently. 🚀

--

--