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

Tại sao một truy vấn chèn đôi khi mất quá nhiều thời gian để hoàn thành?

Tôi đã nhận thấy hiện tượng tương tự trên hệ thống của mình. Các truy vấn thường mất một phần nghìn giây sẽ đột ngột mất 1-2 giây. Tất cả các trường hợp của tôi là các câu lệnh INSERT / UPDATE / REPLACE đơn giản, không nằm trên bất kỳ lệnh SELECT nào. Không có tải, khóa hoặc tích tụ luồng là điều hiển nhiên.

Tôi đã nghi ngờ rằng đó là do xóa các trang bẩn, chuyển các thay đổi vào đĩa hoặc một số mutex ẩn, nhưng tôi vẫn chưa thu hẹp nó.

Cũng bị loại bỏ

  • Tải của máy chủ - không tương quan với tải cao
  • Công cụ - xảy ra với InnoDB / MyISAM / Bộ nhớ
  • Bộ nhớ cache truy vấn MySQL - xảy ra cho dù nó đang bật hay tắt
  • Xoay vòng nhật ký - không có mối tương quan trong các sự kiện

Quan sát duy nhất khác mà tôi có vào thời điểm này là bắt nguồn từ thực tế là tôi đang chạy cùng một db trên nhiều máy. Tôi có một ứng dụng đọc nặng nên tôi đang sử dụng một môi trường có nhân bản - phần lớn tải là trên các nô lệ. Tôi nhận thấy rằng mặc dù có tải tối thiểu trên bản chính, nhưng hiện tượng này xảy ra nhiều hơn ở đó. Mặc dù tôi không thấy có vấn đề gì về khóa, có thể là Innodb / Mysql đang gặp sự cố với đồng thời (luồng)? Nhớ lại rằng các bản cập nhật trên máy chủ sẽ là một luồng.

MySQL Verion 5.1.48

Cập nhật

Tôi nghĩ rằng tôi có một hướng dẫn cho vấn đề trong trường hợp của tôi. Trên một số máy chủ của tôi, tôi nhận thấy hiện tượng này nhiều hơn những máy chủ khác. Nhìn thấy điểm khác biệt giữa các máy chủ khác nhau và điều chỉnh mọi thứ xung quanh, tôi đã dẫn đến Biến hệ thống MySQL innodb innodb_flush_log_at_trx_commit .

Tôi thấy tài liệu hơi khó đọc nhưng innodb_flush_log_at_trx_commit có thể nhận các giá trị 1,2,0:

  • Đối với 1, bộ đệm nhật ký được lưu vào tệp nhật ký cho mỗi lần cam kết và tệp nhật ký được chuyển vào đĩa cho mỗi lần cam kết.
  • Đối với 2, bộ đệm nhật ký được xóa vào tệp nhật ký cho mỗi lần cam kết và tệp nhật ký được chuyển vào đĩa khoảng 1-2 giây một lần.
  • Đối với 0, bộ đệm nhật ký được lưu vào tệp nhật ký mỗi giây và tệp nhật ký được chuyển vào đĩa mỗi giây.

Thực tế, theo thứ tự (1,2,0), như được báo cáo và ghi lại, bạn phải nhận được hiệu suất ngày càng tăng trong giao dịch vì rủi ro tăng lên.

Phải nói rằng, tôi thấy rằng các máy chủ có innodb_flush_log_at_trx_commit=0 hoạt động kém hơn (tức là có nhiều "bản cập nhật dài" hơn 10-100 lần) so với các máy chủ có innodb_flush_log_at_trx_commit=2 . Hơn nữa, mọi thứ ngay lập tức được cải thiện trong những trường hợp xấu khi tôi chuyển nó sang 2 (lưu ý rằng bạn có thể thay đổi nó ngay lập tức).

Vì vậy, câu hỏi của tôi là, thiết lập của bạn là gì? Xin lưu ý rằng tôi không đổ lỗi cho thông số này, mà muốn nhấn mạnh rằng ngữ cảnh của nó có liên quan đến vấn đề này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xampp MySQL không khởi động - Đang cố gắng khởi động dịch vụ MySQL ...

  2. Tại sao LEFT JOIN của MySQL trả về bản ghi NULL khi với mệnh đề WHERE?

  3. Làm cách nào để lưu trữ múi giờ của người dùng trong mysql?

  4. Đối tượng của lớp DateTime không thể được chuyển đổi thành chuỗi

  5. Thực hiện các quyền dựa trên danh tiếng