Khi bạn COUNT(*)
tính chỉ số cột đếm, vì vậy nó sẽ là kết quả tốt nhất. Mysql với công cụ MyISAM thực sự lưu trữ số hàng, nó không đếm tất cả các hàng mỗi khi bạn cố gắng đếm tất cả các hàng. (dựa trên cột của khóa chính)
Sử dụng PHP để đếm hàng không thông minh lắm, vì bạn phải gửi dữ liệu từ mysql sang php. Tại sao phải làm điều đó khi bạn có thể đạt được điều tương tự ở phía mysql?
Nếu COUNT(*)
chậm, bạn nên chạy EXPLAIN
trên truy vấn và kiểm tra xem các chỉ mục có thực sự được sử dụng hay không và chúng nên được thêm vào đâu.
Cách sau không phải là cách nhanh nhất , nhưng có một trường hợp, nơi COUNT(*)
không thực sự phù hợp - khi bạn bắt đầu nhóm kết quả, bạn có thể gặp vấn đề, nơi COUNT
không thực sự đếm tất cả các hàng.
Giải pháp là SQL_CALC_FOUND_ROWS
. Điều này thường được sử dụng khi bạn đang chọn hàng nhưng vẫn cần biết tổng số hàng (ví dụ: đối với phân trang). Khi bạn chọn các hàng dữ liệu, chỉ cần nối SQL_CALC_FOUND_ROWS
từ khóa sau CHỌN:
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
Sau khi bạn đã chọn các hàng cần thiết, bạn có thể nhận được số lượng với một truy vấn duy nhất này:
SELECT FOUND_ROWS();
FOUND_ROWS()
phải được gọi ngay sau truy vấn chọn dữ liệu.
Tóm lại, mọi thứ thực sự phụ thuộc vào số lượng mục nhập bạn có và những gì có trong câu lệnh WHERE. Bạn thực sự nên chú ý đến cách các chỉ mục đang được sử dụng, khi có rất nhiều hàng (hàng chục nghìn, hàng triệu và nhiều hơn).
SELECT 1
và khôngSELECT *
. Có sự khác biệt?