MySQL 5.1 tài liệu
chính thức thừa nhận rằng InnoDB không đưa ra 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ữ bộ đệm ẩn bên trong của siêu dữ liệu như số hàng, v.v., thì công cụ InnoDB lưu trữ cả dữ liệu bảng và 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 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 ước tính động giá trị 'Hàng' bằng cách lấy mẫu một dải dữ liệu bảng (trong * / var / lib / mysql / ibdata **) và sau đó ngoại suy số hàng gần đúng. Nhiều đến mức tài liệu InnoDB thừa nhận số hàng không chính xác lên đến 50% khi sử dụng SHOW TABLE STATUS
Tài liệu MySQL đề xuất sử dụng bộ đệm ẩn truy vấn MySQL để nhận các truy vấn số hàng nhất quán, nhưng tài liệu không chỉ định cách . Sau đây là lời giải thích ngắn gọn về cách thực hiện điều này.
Trước tiên, hãy kiểm tra xem bộ nhớ đệm truy vấn đã được bật chưa:
mysql> SHOW VARIABLES LIKE 'have_query_cache';
Nếu giá trị của have_query_cache là KHÔNG sau đó kích hoạt bộ đệm 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, hãy xem http://dev.mysql. com / doc / refman / 5.1 / en / query-cache.html )
Truy vấn nội dung của bộ đệm với
mysql> SHOW STATUS LIKE 'Qcache%';
Bây giờ hãy sử dụng SQL_CALC_FOUND_ROWS
câu lệnh trong SELECT
truy vấn:
SELECT SQL_CALC_FOUND_ROWS COUNT(*) FROM my_innodb_table
SQL_CALC_FOUND_ROWS
sẽ cố gắng đọc từ bộ nhớ cache và nếu không tìm thấy truy vấn này, hãy thực thi truy vấn đối với bảng được chỉ định và sau đó xác nhận số hàng của bảng vào bộ đệm truy vấn. Các lần thực thi bổ sung của truy vấn trên (hoặc SELECT
'có thể xem được' khác câu lệnh - xem bên dưới) sẽ tham khảo bộ nhớ cache và trả về kết quả chính xác.
Tiếp theo 'cachable' SELECT
truy vấn
- ngay cả khi chúng LIMIT
kết quả - sẽ tham khảo bộ đệm truy vấn và cho phép bạn nhận (chỉ một lần duy nhất) tổng số hàng trong bảng với
SELECT FOUND_ROWS();
trả về tổng số hàng trong bảng chính xác của truy vấn đã lưu trong bộ nhớ cache trước đó.