Chúng tôi có một máy chủ MySQL được cài đặt trong hai máy khác nhau, máy chủ thử nghiệm và máy chủ sản xuất, cả hai cửa sổ, được sử dụng bởi một ứng dụng web.
Vấn đề là có sự khác biệt hiệu năng HUGE giữa hai máy khi thực hiện một số truy vấn (máy chủ sản xuất là máy chậm hơn). Phiên bản MySQL trong cả hai máy chủ đều giống nhau, ngay cả các tệp cấu hình cũng giống nhau (sự khác biệt duy nhất là đường dẫn của dữ liệu và thực tế là máy chủ sản xuất không ghi lại bất cứ điều gì ngoại trừ lỗi). Sự khác biệt về hiệu suất mà tôi đang nói đến là 3 hoặc 4 bậc độ lớn (ví dụ: một truy vấn trong máy chủ thử nghiệm thực thi trong 0,2 giây, trong khi đó trong máy chủ sản xuất thực hiện trong 84 giây).
Các truy vấn vi phạm sử dụng rộng rãi các mệnh đề với "WHERE [...] IN [...]", theo hiểu biết của tôi rằng chúng thường rất chậm và chúng nên được thay thế bằng THAM GIA. Tuy nhiên, phiên bản MySQL mà chúng tôi đang sử dụng là 5.6.19, tự động tối ưu hóa các truy vấn đó, đó là lý do tại sao chúng hoạt động nhanh trong máy chủ thử nghiệm (và chúng nằm trong một phần của chương trình mà chúng tôi không thể thay đổi để chúng tôi không thể tối ưu hóa chúng theo cách thủ công dù sao).
Như tôi đã nói, cài đặt và cấu hình MySQL là giống hệt nhau, vì vậy tôi hoàn toàn không biết vấn đề có thể xảy ra ở đâu. Một mặt, tôi nghi ngờ rằng đó phải là một vấn đề cấu hình thuộc loại nào đó vì chương trình và DB là như nhau, mặt khác, điều này không có ý nghĩa vì cấu hình giống hệt nhau.
Một số dữ liệu trên máy chủ:
Máy chủ thử nghiệm:
- Intel Core 2 Quad Q9400 @ 2.66GHz
- RAM 8GB
- Tiêu chuẩn Windows Server 2008 R2
Máy chủ sản xuất:
- Intel Xeon E5530 @ 2.40GHz
- RAM 5GB
- Tiêu chuẩn Windows Server 2012 R2
Chỉnh sửa: Tôi quên nói một điều quan trọng: có nhiều truy vấn đang được thực thi sử dụng mệnh đề "WHERE ... IN" cho các mệnh đề "vi phạm". Chúng được thực thi nhanh trong cả hai máy, điều này cho tôi thấy rằng chúng đang được tối ưu hóa chính xác bởi MySQL. Thực tế là một số truy vấn được tối ưu hóa khi những người khác không phải là một bí ẩn đối với tôi, NẾU đây là vấn đề thực tế, điều mà tôi không chắc chắn.
Chỉnh sửa # 2: Đây là tệp cấu hình cho cả hai máy chủ: http://pastebin.ca/2834906
Chỉnh sửa # 3: Đây là GIẢI THÍCH của một trong những truy vấn chậm: https://mariadb.org/ea/v36zj EXPLAIN hoàn toàn giống nhau trong cả thử nghiệm và sản phẩm. Bản thân truy vấn có ở đây: http://pastebin.com/VXgBxXmt Nó đã được định dạng với một bộ lọc tự động, vì vậy có lẽ không rõ ràng lắm. Như bạn có thể thấy, khá dài và phức tạp. Nó không được tạo bằng tay, chúng tự động được tạo ra bởi phần mềm, sử dụng một phương ngữ của SQL tiêu chuẩn với một số chức năng.
Ngoài ra, thêm thông tin: Chúng tôi đã khắc phục tạm thời sự cố bằng cách giảm dữ liệu trong máy chủ sản xuất và xóa hầu hết dữ liệu cũ trong DB, điều này sẽ không được sử dụng. Tất nhiên, đây không phải là một giải pháp vì chúng ta cũng cần dữ liệu cũ và nó sẽ là một vấn đề trong tương lai. DB không lớn lắm: DB đầy đủ là 1308 MB, phiên bản rút gọn hiện đang được sản xuất là 332 MB.
CẬP NHẬT: GIẢI QUYẾT ??
Tôi nghĩ rằng tôi đã giải quyết vấn đề. Tôi chưa kiểm tra nó, vì máy chủ sản xuất đang thực sự được sử dụng, nhưng vấn đề có thể xảy ra là tham số "innodb_buffer_pool_size", được đặt thành 182M. Trên thực tế, dòng trong tệp cấu hình hiển thị: innodb_buffer_pool_size = 321 là một lỗi do nó không có tiền tố đơn vị, đưa ra một giá trị không hợp lệ (tối thiểu là 52,2880 theo tài liệu), sau đó đặt nó ở giá trị trước đó . Giá trị này trong máy chủ thử nghiệm được đặt ở mức 321M mong muốn.
Như tôi đã nói, tôi đã không kiểm tra nó hoàn toàn. Những gì tôi đã làm là giảm giá trị trong thử nghiệm và thử ứng dụng. Mọi thứ diễn ra chậm hơn và truy vấn cụ thể mà tôi đã đăng thực hiện trong 3 phút.
Tôi đã đưa vào thử nghiệm giá trị 3Gb lành mạnh hơn, mà tôi không biết liệu đó có phải là một ý tưởng hay không, vì vậy nếu ai đó có một số nhận xét về giá trị này, tôi sẽ đánh giá cao nó.
Kết luận của tôi, "giá trị lành mạnh" của 3Gb và thông tin tôi sử dụng cho việc này xuất phát từ hai bài đăng này, đặc biệt là bài thứ hai:
Truy vấn MySQL, 2 máy chủ tương tự, chênh lệch 2 phút về thời gian thực hiện
Làm thế nào lớn nên mysql innodb_buffer_pool_size?
Tôi sẽ đăng kết quả "thực" khi chúng tôi cập nhật các giá trị trong máy chủ sản xuất.
Cảm ơn tất cả mọi người.
GIẢI QUYẾT
Vì vậy, cuối cùng chúng tôi đã thử nghiệm điều này trong prod, và đó là vấn đề tôi đã nhận xét trước đó. Tôi đặt giá trị của innodb_buffer_pool_size trong 321M, đây là giá trị được đề xuất bởi nhà cung cấp SDK mà chúng tôi sử dụng, mặc dù theo các liên kết trước đó, nó phải ở khoảng 3G cho DB có kích thước và mức sử dụng này.
Mặc dù vậy, tôi vẫn có một nghi ngờ: giá trị của 321 là một giá trị không hợp lệ (quá nhỏ), vì vậy MySQL đã lấy một giá trị khác. Sự nghi ngờ của tôi là nó đã lấy số hợp lệ trước đó, 321M trong thử nghiệm và 182M trong prod, do đó có sự khác biệt về tốc độ. Điều đó chỉ gây tò mò, nhưng tôi muốn biết liệu điều này có đúng không.
Cảm ơn tất cả các bạn một lần nữa vì sự giúp đỡ.