2009-10-19 29 views
6

Tôi đang trong quá trình thêm tính năng mới vào hệ thống. Quá trình này sẽ đọc dữ liệu trực tiếp từ PLC và lưu trữ chúng trong cơ sở dữ liệu. Bảng dữ liệu sẽ có 4 cột: variable_id (SMALLINT), dấu thời gian (TIMESTAMP), giá trị (FLOAT), chất lượng (TINYINT). Khóa chính là (variable_id, dấu thời gian).Định dạng bảng mysql tốt nhất cho tải chèn cao là gì?

Hệ thống cần có thể chèn 1000-2000 bản ghi mỗi giây.

Các bảng dữ liệu sẽ tiếp tục trong 24 giờ cuối cùng của dữ liệu, dữ liệu cũ sẽ bị xóa khỏi bàn.

Bảng dữ liệu cũng cần xử lý 5-10 câu lệnh chọn mỗi giây. Câu lệnh chọn đang chọn giá trị mới nhất từ ​​bảng cho một biến cụ thể và hiển thị nó trên web.

Tôi có nên sử dụng định dạng bảng MyISAM hoặc InnoDB không? MyISAM có khóa toàn bộ bảng trong khi thực hiện chèn, do đó chặn các câu lệnh chọn từ giao diện web không? Hiện tại tất cả các bảng dữ liệu trong cơ sở dữ liệu là các bảng MyISAM.

Trả lời

6

Tôi có nên sử dụng định dạng bảng MyISAM hoặc InnoDB không?

Đối với bất kỳ dự án nào có đọc và ghi đồng thời thường xuyên, bạn nên sử dụng InnoDB.

MyISAM có khóa toàn bộ bảng trong khi chèn, do đó chặn các câu lệnh chọn từ giao diện web không?

Với @@concurrent_insert được bật, MyISAM có thể nối thêm các hàng được chèn vào cuối khi vẫn đọc đồng thời từ một phiên khác.

Tuy nhiên, nếu bạn đã bao giờ để bất cứ điều gì nhưng INSERT, điều này có thể thất bại (i. E. Bảng sẽ khóa).

Hệ thống cần có thể chèn 1000-2000 bản ghi mỗi giây.

Sẽ tốt hơn nếu trộn các lần chèn này và thực hiện theo lô.

InnoDB là nhanh hơn nhiều về mặt hàng mỗi giây hơn trong các giao dịch mỗi giây.

Bảng dữ liệu sẽ giữ 24 giờ dữ liệu cuối cùng, dữ liệu cũ hơn sẽ bị xóa khỏi bảng.

Lưu ý rằng InnoDB khóa tất cả các hàng được kiểm tra, không chỉ những hàng bị ảnh hưởng.

Nếu tuyên bố DELETE bạn đã bao giờ sẽ sử dụng một fullscan, các đồng INSERTs sẽ thất bại (vì fullscan sẽ làm cho InnoDB đặt ổ khóa lỗ hổng trên tất cả các hồ sơ duyệt bao gồm cả người cuối cùng).

+0

Câu trả lời hay. 1 cho bạn. –

2

MyISAM là nhanh hơn, và nó khóa toàn bộ bảng. InnoDB dựa trên giao dịch, vì vậy nó sẽ thực hiện khóa hàng, nhưng chậm hơn.

+1

FWIW, tôi đã có hiệu suất tuyệt vời từ InnoDB, nhưng MyISAM nhanh hơn rất nhiều. Họ có được với nó bởi vì họ vô hiệu hóa rất nhiều kiểm tra InnoDB nào. –

+0

Cảm ơn câu trả lời của bạn. Với MyISAM khi tôi chèn các bản ghi là bảng bị khóa cho các câu lệnh chọn? Ví dụ, nếu một câu lệnh chèn mất 5 giây để hoàn thành (chỉ một số ngẫu nhiên) thì câu lệnh chọn phải chờ 5 giây cho đến khi nó trả về kết quả? – thoraniann

+0

Tôi nghĩ Quassnoi trả lời câu hỏi đó - kiểm tra bit về @@ concurrent_insert. –

Các vấn đề liên quan