2011-12-24 25 views
13

Tôi biết rằng bạn không nên dựa vào các giá trị được trả về bởi SHOW TABLE STATUS của InnoDB. Cụ thể, số lượng hàng và thời lượng dữ liệu trung bình.Tại sao BẢNG TẠM BẢNG của innodb lại không đáng tin cậy?

Nhưng tôi nghĩ có lẽ đó là giá trị chính xác tại một thời điểm nào đó, và sau đó innodb chỉ làm mới nó trong một bảng ANALYZE hoặc có thể một số sự kiện không thường xuyên khác. Thay vào đó những gì Im thấy là tôi có thể chạy SHOW TABLE STATUS trên cùng một bảng 5 lần trong 5 giây và chỉ nhận được các con số hoàn toàn khác nhau mỗi lần (mặc dù bảng không có bất kỳ hoạt động chèn/xóa nào ở giữa)

Các giá trị này thực sự đến từ đâu? Họ chỉ tham nhũng trong innodb?

Trả lời

20

MySQL 5.1 documentation chính thức xác nhận rằng InnoDB không cung cấp số liệu thống kê chính xác với SHOW TABLE STATUS. Trong khi các bảng MYISAM đặc biệt lưu giữ một bộ nhớ cache nội bộ của siêu dữ liệu như số hàng vv, thì công cụ InnoDB lưu trữ cả dữ liệu bảng và các chỉ mục trong */var/lib/mysql/ibdata **

InnoDB không có tệp chỉ mục thích hợp cho phép truy vấn nhanh các số hàng.

Số hàng trong bảng không nhất quán được báo cáo bởi SHOW TABLE STATUS vì InnoDB tự động ước tính giá trị 'Hàng' bằng cách lấy mẫu phạm vi dữ liệu bảng (trong */var/lib/mysql/ibdata **) và sau đó ngoại suy số gần đúng của hàng. Vì vậy, nhiều đến nỗi các tài liệu InnoDB thừa nhận số hàng thiếu chính xác lên đến 50% khi sử dụng SHOW TABLE STATUS

tài liệu MySQL cho thấy sử dụng bộ nhớ cache truy vấn MySQL để có được truy vấn số hàng phù hợp, nhưng các tài liệu không chỉ định cách. Một lời giải thích ngắn gọn về cách thức này có thể được thực hiện sau đây.

Đầu tiên, hãy kiểm tra rằng bộ nhớ đệm truy vấn được kích hoạt:

mysql> SHOW VARIABLES LIKE 'have_query_cache'; 

Nếu giá trị của have_query_cacheNO sau đó kích hoạt bộ nhớ cache truy vấn bằng cách thêm các dòng sau vào /etc/my.cnf và sau đó khởi động lại mysqld.

have_query_cache=1 # added 2017 08 24 wh 
query_cache_size = 1048576 
query_cache_type = 1 
query_cache_limit = 1048576 

(để biết thêm thông tin, xem http://dev.mysql.com/doc/refman/5.1/en/query-cache.html)

Query nội dung của bộ nhớ cache với

mysql> SHOW STATUS LIKE 'Qcache%'; 

Bây giờ sử dụng câu lệnh SQL_CALC_FOUND_ROWS trong một truy vấn SELECT:

SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table 

SQL_CALC_FOUND_ROWS sẽ lên kế hoạch pt một đọc từ bộ nhớ cache và, nên truy vấn này không được tìm thấy, thực hiện truy vấn đối với bảng được chỉ định và sau đó cam kết số lượng các hàng trong bảng cho bộ đệm truy vấn. Việc thực hiện bổ sung truy vấn trên (hoặc các câu lệnh khác 'có thể lưu vào bộ nhớ cache' SELECT - xem bên dưới) sẽ tham khảo bộ nhớ cache và trả lại kết quả chính xác.

Tiếp theo 'cachable' SELECT queries - ngay cả khi họ LIMIT kết quả - sẽ tham khảo ý kiến ​​các bộ nhớ cache truy vấn và cho phép bạn để có được (một lần-off chỉ) tổng số bàn hàng với

SELECT FOUND_ROWS(); 

mà trả về cache truy vấn trước đó của đúng tổng số hàng trong bảng.

+0

Bạn có thể giải thích ý bạn bằng cách thẩm vấn bộ đệm truy vấn để lấy số liệu thống kê không? Tôi hiểu bộ nhớ cache truy vấn và cách hoạt động của nó, nhưng tôi không chắc chắn rằng tôi thấy sự liên quan của nó ở đây – carpii

+0

Tôi đã chỉnh sửa câu trả lời của mình để giải thích cách sử dụng bộ nhớ truy vấn – venzen

3

Lý do không lưu giữ số liệu thống kê chính xác, bao gồm số lượng hàng trong bảng, là sự đa dạng của các hàng mà InnoDB sử dụng để cung cấp các giao dịch. Số lượng hàng thực tế phụ thuộc vào mức cô lập của giao dịch (như giao dịch không cam kết có thể đã xóa hoặc chèn bản ghi), và các giao dịch khác nhau có thể chạy ở các mức cách ly khác nhau, có nghĩa là câu hỏi 'có bao nhiêu bản ghi 'có thể được trả lời chính xác chỉ khi không có giao dịch nào đang chạy. Vì vậy, giữ một truy cập của các hàng hoặc chiều dài dữ liệu là gần như không thể.

Đọc thêm về InnoDB restrictions

+0

Bạn có biết các giá trị thực sự đến từ đâu khi tôi phát hành TÌNH TRẠNG BẢNG HIỂN THỊ ? Không có giao dịch nào có thể ảnh hưởng đến bảng, nhưng các giá trị vẫn có vẻ hoàn toàn ngẫu nhiên. – carpii

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