Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tại sao TRẠNG THÁI BẢNG HIỂN THỊ của innodb lại không đáng tin cậy như vậy?

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 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 đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khóa SQL, MUL so với PRI và UNI

  2. Lỗi mysqldump 1045 Quyền truy cập bị từ chối mặc dù mật khẩu chính xác, v.v.

  3. MySQL khôi phục trên giao dịch với kết nối bị mất / ngắt kết nối

  4. cách xuất bản trình cài đặt ứng dụng c # window

  5. Tìm khối thời gian rảnh trong mysql và php?