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

MySQL / InnoDB và các truy vấn chạy dài

Đầu tiên, tôi nghĩ rằng sẽ hữu ích khi đọc lên kiểm soát đồng thời nhiều phiên bản (MVCC) làm nền cho câu trả lời này.

InnoDB triển khai MVCC, có nghĩa là nó có thể sử dụng các lần đọc không khóa cho SELECT thông thường . Điều này không yêu cầu tạo "ảnh chụp nhanh" và trên thực tế, InnoDB không có bất kỳ khái niệm thực sự nào về ảnh chụp nhanh như một đối tượng. Thay vào đó, mọi bản ghi trong cơ sở dữ liệu sẽ theo dõi số phiên bản của chính nó và duy trì một "con trỏ cuộn" đến một bản ghi "hoàn tác nhật ký" (có thể vẫn tồn tại hoặc có thể vẫn tồn tại) để sửa đổi hàng thành phiên bản trước của nó. Nếu cần phiên bản cũ hơn của bản ghi, thì phiên bản hiện tại sẽ được đọc và các con trỏ cuộn đó được theo sau và hoàn tác các bản ghi được áp dụng cho đến khi tạo ra một phiên bản đủ cũ của bản ghi.

Thông thường, hệ thống liên tục dọn dẹp các nhật ký hoàn tác đó và sử dụng lại dung lượng mà chúng đã sử dụng.

Bất kỳ lúc nào bất kỳ giao dịch dài hạn nào (lưu ý, không nhất thiết phải có một truy vấn duy nhất), các nhật ký hoàn tác phải được giữ lại (không bị xóa) để tạo đủ các phiên bản cũ đủ cũ của tất cả các bản ghi để đáp ứng giao dịch đó. Trong một hệ thống rất bận rộn, các bản ghi hoàn tác đó có thể tích lũy rất nhanh để tiêu tốn hàng gigabyte dung lượng. Ngoài ra, nếu các bản ghi riêng lẻ cụ thể thường xuyên bị sửa đổi, việc hoàn nguyên bản ghi đó về một phiên bản đủ cũ để đáp ứng truy vấn có thể mất rất nhiều ứng dụng ghi nhật ký hoàn tác (hàng nghìn).

Đó là những gì làm cho "các truy vấn dài" trở nên đắt đỏ và khó chịu. Chúng sẽ làm tăng mức tiêu thụ không gian đĩa để giữ các nhật ký hoàn tác trong không gian bảng hệ thống và chúng sẽ hoạt động kém do ứng dụng ghi nhật ký hoàn tác để hoàn nguyên các phiên bản hàng khi đọc.

Một số cơ sở dữ liệu triển khai lượng không gian nhật ký hoàn tác tối đa có thể được sử dụng và khi chúng đạt đến giới hạn đó, chúng bắt đầu loại bỏ các bản ghi nhật ký hoàn tác cũ hơn và làm mất hiệu lực các giao dịch đang chạy. Điều này tạo ra thông báo lỗi "ảnh chụp nhanh quá cũ" cho người dùng. InnoDB không có giới hạn như vậy và cho phép tích lũy vô thời hạn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bản ghi SQL Count trong vòng một tháng sử dụng dấu thời gian unix

  2. Có bao nhiêu hàng là 'quá nhiều' đối với một bảng MySQL?

  3. Thứ tự MySQL theo chuỗi với số

  4. Làm cách nào để tạo ứng dụng Android với cơ sở dữ liệu MySQL cục bộ?

  5. Ngoại lệ Python MySQLdb