Đếm số hàng


165

Lệnh MySQL để lấy số lượng bản ghi trong bảng là gì?

Câu trả lời:


236
SELECT COUNT(*) FROM fooTable;

sẽ đếm số lượng hàng trong bảng.

Xem hướng dẫn tham khảo .


7
Có nhanh hơn không khi tôi sử dụng tên của cột được lập chỉ mục thay vì *? Như thế này: CHỌN COUNT (id) TỪtablename

1
Chỉ một chút thôi. Tôi đã nhận được một bảng hàng 21961904 mà COUNT của anh ấy đã truy vấn trong 115 giây, trong khi sử dụng ID mất 107 giây.
Bondolin

2
COUNT (*) là một định nghĩa ngôn ngữ nghiêm ngặt. Bạn sẽ gặp lỗi phân tích cú pháp nếu bạn thử COUNT (*) lưu ý khoảng
trắng

9
Bạn có thể làm COUNT(1), đây sẽ là cách nhanh nhất.
Shota Papiashvili

Cách tốt nhất để sử dụng COUNT () để viết một biến trong PHP là gì? Tôi có thực hiện "... COUNT (*) AS rowCount ..." trong SQL không, nó có sử dụng $ results-> num_rows hay có cách nào để gọi kết quả này trực tiếp không?
Nosajimiki

71

Bởi vì không ai đề cập đến nó:

show table status;

liệt kê tất cả các bảng cùng với một số thông tin bổ sung, bao gồm các hàng ước tính cho mỗi bảng. Đây là những gì phpMyAdmin đang sử dụng cho trang cơ sở dữ liệu của nó.

Thông tin này có sẵn trong MySQL 4, có lẽ trong MySQL 3.23 cũng vậy - cơ sở dữ liệu lược đồ thông tin trước đó trong thời gian dài.

CẬP NHẬT:

Vì đã bỏ phiếu, tôi muốn làm rõ rằng số lượng hiển thị được ước tính cho InnoDB và TokuDB và nó hoàn toàn chính xác cho các công cụ lưu trữ MyISAM và Aria (Maria).

Theo tài liệu :

Số lượng hàng. Một số công cụ lưu trữ, như MyISAM, lưu trữ số lượng chính xác. Đối với các công cụ lưu trữ khác, chẳng hạn như InnoDB, giá trị này là một xấp xỉ và có thể thay đổi từ giá trị thực tế từ 40% đến 50%. Trong những trường hợp như vậy, hãy sử dụng CHỌN COUNT (*) để có được số đếm chính xác.

Đây cũng là cách nhanh nhất để xem số hàng trên MySQL, bởi vì truy vấn như:

select count(*) from table;

Thực hiện quét toàn bộ bảng những gì có thể là hoạt động rất tốn kém có thể mất nhiều giờ trên máy chủ tải lớn. Nó cũng tăng I / O đĩa.

Hoạt động tương tự có thể chặn bảng để chèn và cập nhật - điều này chỉ xảy ra trên các công cụ lưu trữ kỳ lạ.

InnoDB và TokuDB đều ổn với khóa bảng, nhưng cần quét toàn bộ bảng.


3
Đây có vẻ là cách hiệu quả nhất để đếm hàng. Tôi tự hỏi tại sao nó không phải là câu trả lời? Tôi đang sử dụng InnoDB. Với khóa bảng, số lượng hàng phải chính xác phải không?
Chung Lun Yuen

cho innodb nó được ước tính . nhưng bạn có thể sử dụng nó trong một số trường hợp "Trang web của chúng tôi có thành viên xxx", "Chúng tôi đã phát hiện kết quả xxx tương tự như của bạn", v.v.
Nick

Tôi không chắc. nhưng đối với Innodb thì không có giá trị. Nhưng là khá hữu ích cho hàng triệu bảng hàng.
Nick

4
Đi qua các bảng để đếm từng hàng để có được một hàng là khá vô lý. Vì vậy, tôi thích câu trả lời này là tốt.
th3penguinwhisperer

35

Chúng tôi có một cách khác để tìm ra số lượng hàng trong một bảng mà không cần chạy selecttruy vấn trên bảng đó.

Mỗi phiên bản MySQL có cơ sở dữ liệu information_schema. Nếu bạn chạy truy vấn sau, nó sẽ cung cấp chi tiết đầy đủ về bảng bao gồm số lượng hàng gần đúng trong bảng đó.

select * from information_schema.TABLES where table_name = 'table_name'\G

Đây có phải là nhanh hơn trên bảng MyISAM vì MyISAM đang lưu trữ số lượng hàng?
NaturalBornCamper

Tôi chưa bao giờ thử nghiệm điều này trên MyISAM.
Santhosh Tangudu



3

Chỉ cần làm một

SELECT COUNT(*) FROM table;

Bạn có thể chỉ định các điều kiện với một Where sau đó

SELECT COUNT(*) FROM table WHERE eye_color='brown';

3

Nếu bạn có một số trường trong bảng và bảng của bạn rất lớn, tốt hơn là KHÔNG SỬ DỤNG * vì nó tải tất cả các trường vào bộ nhớ và sử dụng các mục sau sẽ có hiệu suất tốt hơn

SELECT COUNT(1) FROM fooTable;

Điều này là không đúng. Xem stackoverflow.com/questions/5179969/ Hàn COUNT (1) thực sự có thể chậm hơn nhiều đối với MyISAM.
jcoffland

@jcoffland bạn có thể tự mình thử, đặc biệt là khi bạn có một người tham gia hoặc nơi có điều kiện sẽ nhanh hơn nhiều so với số lượng (*).
Yuseferi

2

Như Santosh đã đề cập , tôi nghĩ truy vấn này nhanh chóng phù hợp, trong khi không truy vấn tất cả các bảng.

Để trả về kết quả số nguyên của số lượng bản ghi dữ liệu, cho một tablename cụ thể trong cơ sở dữ liệu cụ thể :

select TABLE_ROWS from information_schema.TABLES where TABLE_SCHEMA = 'database' 
AND table_name='tablename';

1
Điều này có thể trả về một số lượng hàng ước tính. Trong một ví dụ, tôi đã nhận được 55.940.343 hàng bằng cách sử dụng COUNT (*) nhưng 56.163.339 bằng phương pháp này vì vậy nó đã bị giảm hơn 200k.
jcoffland

@jcoffland, tôi đã đề cập câu trả lời của _ Santosh_ ở trên, trong đó nêu kết quả là gần đúng . Câu trả lời của tôi là một truy vấn thực tế chi tiết hơn. Câu trả lời khá rõ ràng nếu bạn muốn sử dụng số lượng chính xác count(*)với nhận thức về hiệu suất
Mohammad Kanan

1
$sql="SELECT count(*) as toplam FROM wp_postmeta WHERE meta_key='ICERIK' AND post_id=".$id;
$total = 0;
$sqls = mysql_query($sql,$conn);
if ( $sqls ) {
    $total = mysql_result($sqls, 0);
};
echo "Total:".$total;`

Câu trả lời này đã lỗi thời, mysql_result không được dùng nữa trong PHP 5.5.0 và bị xóa trong PHP 7.0.0
Biến thế giới này thành một nơi tốt hơn

1

Bạn phải sử dụng Count () trả về số lượng hàng phù hợp với tiêu chí đã chỉ định

select count(*) from table_name;

0

Nếu bạn có khóa chính hoặc khóa / chỉ mục duy nhất, phương pháp nhanh hơn có thể (Đã thử nghiệm với 4 triệu bảng hàng)

SHOW INDEXES FROM "database.tablename" WHERE Key_Name=\"PRIMARY\"

và sau đó nhận trường cardinality (gần với ngay lập tức)

Thời gian từ 0,4 đến 0,0001ms

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.