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_cache là NO 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.
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
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