Giải pháp: COUNT(1) hoặc COUNT(0)
COUNT(1) và COUNT(0) tương đương COUNT(*) nhưng một số engine tối ưu hơn chút (không check column metadata).
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (
StudentName VARCHAR(100)
);
mysql> INSERT INTO DemoTable(StudentName) VALUES('John Smith');
mysql> INSERT INTO DemoTable(StudentName) VALUES('Chris Brown');
mysql> INSERT INTO DemoTable(StudentName) VALUES('David Miller');
mysql> INSERT INTO DemoTable(StudentName) VALUES('Carol Taylor');
Truy vấn COUNT(1)
mysql> SELECT COUNT(1) FROM DemoTable;
Kết quả
+----------+ | count(1) | +----------+ | 4 | +----------+
Các phương pháp khác đếm dòng
| Phương pháp | Cú pháp | Đặc điểm |
|---|---|---|
| COUNT(*) | SELECT COUNT(*) FROM tbl | Chuẩn SQL, đếm tất cả dòng |
| COUNT(1) | SELECT COUNT(1) FROM tbl | Tương đương COUNT(*), thường tối ưu hơn |
| COUNT(0) | SELECT COUNT(0) FROM tbl | Tương đương COUNT(*) |
| COUNT(pk) | SELECT COUNT(id) FROM tbl | Đếm PK NOT NULL, dùng index PK |
| SUM(1) | SELECT SUM(1) FROM tbl | Tương đương COUNT(*) |
| Information Schema | SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='tbl' | Siêu nhanh, nhưng không chính xác (ước lượng) |
| SHOW TABLE STATUS | SHOW TABLE STATUS LIKE 'tbl' | Nhanh, ước lượng |
Hiệu năng thực tế (InnoDB)
COUNT(*)/COUNT(1)/COUNT(pk): Tương đương, quét full index (thường là PK)- MyISAM:
COUNT(*)siêu nhanh (lưu sẵn row count) - InnoDB: Không lưu row count chính xác do MVCC
Khi nào dùng cách nào?
- Ứng dụng thường:
COUNT(*)hoặcCOUNT(1)- chuẩn, đủ nhanh - Bảng cực lớn (triệu+ dòng), cần đếm thường xuyên:
- Dùng trigger/maintain counter table
- Hoặc cache (Redis) với TTL
- Hoặc approximate count từ
INFORMATION_SCHEMA.TABLES.TABLE_ROWS
Mẹo: Đếm có điều kiện
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count,
COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;