2013-04-03 27 views
16

Ở đây tôi đang nhấn và chạy cùng một lệnh trên DB dev của tôi trên máy tính xách tay của tôi, hơn và hơn;MySQL cung cấp số lượng hàng dao động khi tôi truy vấn lược đồ?

mysql> select count(*) from tblTraceOutput; 
+----------+ 
| count(*) | 
+----------+ 
| 300175 | 
+----------+ 
1 row in set (0.42 sec) 

mysql> select count(*) from tblTraceOutput; 
+----------+ 
| count(*) | 
+----------+ 
| 300175 | 
+----------+ 
1 row in set (0.35 sec) 

mysql> select count(*) from tblTraceOutput; 
+----------+ 
| count(*) | 
+----------+ 
| 300175 | 
+----------+ 
1 row in set (0.45 sec) 

Ở đây tôi đang làm việc cùng, nhấn 'lên' và chạy lệnh cuối cùng một lần nữa, nhưng sản lượng được chaning. Chuyện gì đang xảy ra ở đây? Không có gì là sử dụng cơ sở dữ liệu này vì nó là một bản sao trên máy tính xách tay địa phương của tôi cho tinkering của riêng tôi. Tại sao số lượng bảng hàng thay đổi cho bảng tblTraceOutput?

mysql> SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'smoketrace'; 
+----------------+------------+ 
| table_name  | table_rows | 
+----------------+------------+ 
| tblCategories |   9 | 
| tblResults  |  32463 | 
| tblRoutes  |  300 | 
| tblSettings |   2 | 
| tblTraceOutput |  303463 | 
| tblTraces  |   12 | 
+----------------+------------+ 
6 rows in set (0.01 sec) 

mysql> SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'smoketrace'; 
+----------------+------------+ 
| table_name  | table_rows | 
+----------------+------------+ 
| tblCategories |   9 | 
| tblResults  |  32948 | 
| tblRoutes  |  246 | 
| tblSettings |   2 | 
| tblTraceOutput |  297319 | 
| tblTraces  |   12 | 
+----------------+------------+ 
6 rows in set (0.00 sec) 

mysql> SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'smoketrace'; 
+----------------+------------+ 
| table_name  | table_rows | 
+----------------+------------+ 
| tblCategories |   9 | 
| tblResults  |  32948 | 
| tblRoutes  |  451 | 
| tblSettings |   2 | 
| tblTraceOutput |  302127 | 
| tblTraces  |   12 | 
+----------------+------------+ 
6 rows in set (0.02 sec) 

Tôi đã thấy hành vi này trong phpMyAdmin khi làm mới trang, vì vậy tôi muốn tự mình kiểm tra CLI và như bạn thấy, nó thực sự đang thay đổi!

mysql --version 
./bin/mysql Ver 14.14 Distrib 5.5.8, for Linux (i686) using EditLine wrapper 
free -m 
      total  used  free  shared buffers  cached 
Mem:   1880  1830   49   0   51  600 
-/+ buffers/cache:  1179  701 
Swap:   1027   0  1026 
uname -a 
Linux laptop 3.4.11 #1 SMP Sun Sep 23 15:03:21 BST 2012 i686 i686 i386 GNU/Linux 
+0

bất cứ điều gì khác chọc vào bàn? Đừng quên rằng trên bảng innodb, một số hàng sẽ bị ẩn bởi các giao dịch, nhưng vẫn phải được tính nội bộ –

+0

Không có gì là sử dụng cơ sở dữ liệu nếu đó là những gì bạn có ý nghĩa. Chỉ 15 phút kể từ khi tôi nhập dữ liệu, nhưng nó là <40MB, tôi đã tự hỏi liệu nó có còn là chỉ mục hay tương tự, nhưng CPU của tôi là 1% ~ 2% được sử dụng – jwbensley

Trả lời

18

Giả sử bạn đang sử dụng InnoDB, vì đó là mặc định trong 5.5.x according to the MySQL INFORMATION_SCHEMA TABLES documentation.

Và ghi chú này:

Cột TABLE_ROWS là NULL nếu bảng là trong cơ sở dữ liệu INFORMATION_SCHEMA.

Đối với bảng InnoDB, số lượng hàng chỉ là ước tính sơ bộ được sử dụng trong tối ưu hóa SQL . (Điều này cũng đúng nếu bảng InnoDB được phân đoạn.)

+3

Cảm ơn câu trả lời, kỳ lạ mặc dù là một estiamte, nó không thể thực hiện ước lượng tương tự hai lần liên tiếp! – jwbensley

5

Nếu bạn đang sử dụng InnoDB làm công cụ lưu trữ, số hàng là ước tính.

For InnoDB tables, the row count is only a rough estimate used in SQL optimization. 

Source

1

Có vẻ như bạn đang sử dụng một bảng InnoDB. Họ chỉ giữ một ước tính rất thô của các số hàng trong bảng trạng thái có nghĩa là để giúp trình tối ưu hóa MySQL có cơ sở cho các lựa chọn kế hoạch truy vấn. Đối với một số hàng chính xác, bạn nên giữ một bộ đếm riêng biệt nếu cần thiết thường xuyên (vì chọn số (*) là xa hiệu quả).

6

Nó không phải là lỗi. Giá trị được báo cáo trong cột table_rows của information_schema.tables không được đảm bảo chính xác, cũng như chúng tôi không mong đợi.

Các vấn đề liên quan