Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Đếm số dòng bảng không dùng COUNT(*) trong MySQL?

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ápCú phápĐặc điểm
COUNT(*)SELECT COUNT(*) FROM tblChuẩn SQL, đếm tất cả dòng
COUNT(1)SELECT COUNT(1) FROM tblTương đương COUNT(*), thường tối ưu hơn
COUNT(0)SELECT COUNT(0) FROM tblTương đương COUNT(*)
COUNT(pk)SELECT COUNT(id) FROM tblĐếm PK NOT NULL, dùng index PK
SUM(1)SELECT SUM(1) FROM tblTương đương COUNT(*)
Information SchemaSELECT 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 STATUSSHOW 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ặc COUNT(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;