2012-05-05 16 views
12

Sau khi nhận thấy rằng cơ sở dữ liệu của chúng tôi đã trở thành một nút cổ chai lớn trên hệ thống sản xuất trực tiếp của chúng tôi, tôi quyết định xây dựng một tiêu chuẩn đơn giản để tìm hiểu vấn đề.InnoDB Bottleneck: ACID thư giãn để cải thiện hiệu suất

Điểm chuẩn: Tôi phải mất bao lâu để tăng cùng một hàng trong bảng InnoDB 3000 lần, trong đó hàng được đánh chỉ mục bằng khóa chính của nó và cột được cập nhật không thuộc bất kỳ chỉ mục nào. Tôi thực hiện 3000 cập nhật này bằng cách sử dụng 20 máy khách đồng thời chạy trên một máy từ xa, mỗi máy có kết nối riêng với DB.

Tôi quan tâm đến việc tìm hiểu lý do tại sao các công cụ lưu trữ khác nhau mà tôi đã đánh giá, InnoDB, MyISAM và MEMORY, có các cấu hình mà chúng thực hiện. Tôi cũng hy vọng sẽ hiểu tại sao InnoDB lại có giá thành thấp đến vậy.

InnoDB (20 khách hàng đồng thời): Mỗi bản cập nhật mất 0,75 giây. Tất cả các cập nhật được thực hiện sau 6.68s.

MyISAM (20 khách hàng đồng thời): Mỗi bản cập nhật mất 0,003 giây. Tất cả các cập nhật được thực hiện sau 0,85 giây.

Bộ nhớ (20 khách hàng đồng thời): Mỗi bản cập nhật mất 0,0019 giây. Tất cả các cập nhật được thực hiện sau 0,80 giây.

Nghĩ rằng đồng thời có thể gây ra hành vi này, tôi cũng đã đánh giá một khách hàng duy nhất thực hiện 100 cập nhật liên tục.

InnoDB: Mỗi bản cập nhật mất 0,0026 giây.

MyISAM: Mỗi bản cập nhật cần 0,0006 giây.

BỘ NHỚ: Mỗi bản cập nhật mất 0,0005 giây.

Máy thực tế là một cá thể Amazon RDS (http://aws.amazon.com/rds/) với cấu hình chủ yếu là mặc định.

Tôi đoán câu trả lời sẽ theo các dòng sau: InnoDB fsyncs sau mỗi lần cập nhật (vì mỗi lần cập nhật là giao dịch tuân thủ ACID), trong khi MyISAM không vì nó không hỗ trợ giao dịch. MyISAM có thể thực hiện tất cả các bản cập nhật trong bộ nhớ, và thường xuyên xả đĩa, đó là cách tốc độ của nó tiếp cận động cơ lưu trữ MEMORY. Nếu điều này là như vậy, có cách nào để sử dụng InnoDB cho hỗ trợ giao dịch của nó, nhưng có lẽ thư giãn một số hạn chế (thông qua cấu hình) để viết được thực hiện nhanh hơn với chi phí của một số độ bền?

Ngoài ra, mọi đề xuất về cách cải thiện hiệu suất của InnoDB khi số lượng khách hàng tăng lên? Nó rõ ràng là thu nhỏ hơn so với các công cụ lưu trữ khác.

Cập nhật

tôi thấy https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance, đó là chính xác những gì tôi đang tìm kiếm. Thiết lập innodb-flush-log-at-trx-commit = 2 cho phép chúng ta để thư giãn các ràng buộc ACID (đỏ bừng lên đĩa xảy ra một lần mỗi giây) đối với trường hợp xảy ra mất điện hoặc sự cố máy chủ. Điều này mang lại cho chúng ta một hành vi tương tự như MyISAM, nhưng chúng tôi vẫn được hưởng lợi từ các tính năng giao dịch có sẵn trong InnoDB.

Chạy cùng điểm chuẩn, chúng tôi thấy hiệu suất ghi được cải thiện gấp 10 lần.

InnoDB (20 khách hàng đồng thời): Mỗi bản cập nhật mất 0,017 giây. Tất cả các cập nhật được thực hiện sau 0,98.

Bất kỳ đề xuất nào khác?

+0

myisam theo thiết kế không tuân thủ ACID. InnoDB là. Nếu bạn thư giãn các ràng buộc, thì nó không còn tuân thủ ACID nữa, và bạn cũng có thể KHÔNG sử dụng innodb. –

+0

Bạn * đang * sử dụng giao dịch ... phải không? Khi một giao dịch hoàn thành InnoDB * phải * thực hiện xóa phần cứng để đảm bảo ["D" trong ACID] ​​(http://en.wikipedia.org/wiki/ACID#Durability). Ngay cả các DBID ACID nhanh cũng bị giới hạn trong khoảng 30-50 * giao dịch */giây ** trên các đĩa trục chính "chuẩn". (Tuy nhiên, không khó để có được hàng ngàn * cập nhật */giây. Có sự khác biệt.) –

+2

Đó là sự thật, chúng tôi không cần tuân thủ đầy đủ ACID. Nhưng, nếu chúng ta muốn một dạng ACI yếu hơn (không có D) cho các tính năng như cách ly giao dịch thì sao? Vì dữ liệu của chúng tôi không quá nhạy cảm và chúng tôi sử dụng Amazon RDS với Multi-AZ, các sự cố hiếm gặp và mất điện không phải là mối lo ngại đối với chúng tôi. – BrainCore

Trả lời

5

Tôi tìm thấy https://blogs.oracle.com/MySQL/entry/comparing_innodb_to_myisam_performance, chính xác là những gì tôi đang tìm kiếm. Thiết lập innodb-flush-log-at-trx-commit = 2 cho phép chúng ta để thư giãn các ràng buộc ACID (đỏ bừng lên đĩa xảy ra một lần mỗi giây) đối với trường hợp xảy ra mất điện hoặc sự cố máy chủ. Điều này mang lại cho chúng ta một hành vi tương tự như MyISAM, nhưng chúng tôi vẫn được hưởng lợi từ các tính năng giao dịch có sẵn trong InnoDB.

Chạy cùng điểm chuẩn, chúng tôi thấy hiệu suất ghi được cải thiện gấp 10 lần.

InnoDB (20 khách hàng đồng thời): Mỗi bản cập nhật mất 0,017 giây. Tất cả các bản cập nhật được thực hiện sau 0,98.

4

Chúng tôi đã thực hiện một số thử nghiệm tương tự trong ứng dụng của chúng tôi và chúng tôi nhận thấy rằng nếu không có giao dịch nào được mở một cách rõ ràng, mỗi lệnh SQL được xử lý trong một giao dịch, mất nhiều thời gian hơn để thực thi. Nếu logic nghiệp vụ của bạn cho phép, bạn có thể đặt một số lệnh SQL bên trong một khối giao dịch, giảm toàn bộ chi phí ACID. Trong trường hợp của chúng tôi, chúng tôi đã cải thiện hiệu suất tuyệt vời với phương pháp này.