2012-12-20 27 views
5

Tôi có một quy trình song song với khoảng 64 trẻ em mà mỗi người cần chèn dữ liệu vào bảng đích. Tôi hiện đang sử dụng một công cụ MyISAM MySQL và tôi tắt các khóa trước và sau khi chèn.Cách nhanh hơn để đồng thời chèn dữ liệu vào MySQL

Tuy nhiên, điều này có vẻ là một nút cổ chai lớn trong quá trình của tôi. Tôi tin rằng MySQL là bảng khóa cho mỗi chèn và vì vậy các quá trình liên tục chờ đợi để viết.

Chèn là độc lập và không có nguy cơ chèn xung đột. Điều này cũng không cần giao dịch hoặc bất cứ điều gì về bản chất đó.

Có một công cụ khác hoặc cách cải thiện hiệu suất chèn/ghi của MySQL không?

Tôi đã nghĩ về instantiating một bảng cho mỗi quá trình, nhưng điều này sẽ làm cho đoạn code phức tạp hơn, và đó không phải là phong cách của tôi thực sự ....

Bất kỳ lời đề nghị sẽ được đánh giá rất nhiều.

Cảm ơn!

Trả lời

4

Như ghi nhận dưới INSERT DELAYED Syntax:

Tùy chọn DELAYED cho tuyên bố INSERT là một phần mở rộng MySQL to SQL tiêu chuẩn mà là rất hữu ích nếu bạn có khách hàng mà không thể hoặc không cần phải chờ đợi cho INSERT để hoàn thành.

[ deletia ]

Một lợi ích lớn của việc sử dụng INSERT DELAYED là chèn từ nhiều khách hàng đang đi kèm với nhau và viết bằng một khối. Điều này là nhanh hơn nhiều so với thực hiện nhiều chèn riêng biệt.

+0

vâng, tôi đã nghĩ về điều này, nhưng mối quan tâm của tôi là máy xử lý và máy chủ là cùng một máy. Khi sử dụng Insert Delayed, MySQL sẽ giữ dữ liệu ở đâu? RAM, SWAP, đĩa? Tôi chạy khá gần với giới hạn RAM đã có với các trẻ em đang xử lý ... CẢM ƠN! – user1459544

+1

@ user1459544: "* Các hàng xếp hàng chỉ được giữ trong bộ nhớ cho đến khi chúng được chèn vào bảng. *" - tất nhiên, O/S sẽ chuyển sang bộ nhớ ảo theo yêu cầu - nhưng nếu bạn thấp RAM, nó có lẽ đáng để đầu tư vào một số chi tiết nữa. – eggyal

+0

Tôi nghĩ rằng tại 256GB máy này được khai thác, nhưng cho phép cho nó một đi và tôi sẽ cho bạn biết làm thế nào nó quay ra. Có lẽ nếu nó có thể vào DB nhanh hơn, con tôi sẽ giải phóng tài nguyên RAM của họ nhanh hơn và tốt hơn cho tất cả mọi người. – user1459544

2

MyISAM thực sự khóa bảng khi chèn, cập nhật hoặc xóa. InnoDB cho phép giao dịch và khóa dựa trên hàng.

Bạn cũng có thể xem xét LOAD DATA INFILE nhanh hơn để chèn hàng loạt.

+1

InnoDB sẽ vẫn thực hiện một khóa tiếp theo, phát hành mà chèn khác sẽ phải chờ đợi. Đáng buồn thay 'LOAD DATA INFILE' cũng sẽ không được sử dụng nhiều ở đây, vì không có" chèn số lượng lớn "nhưng thay vì chèn nhiều cá nhân từ các máy khách khác nhau. – eggyal

+0

Tôi có thể đặt đường ống chèn vào văn bản, thậm chí có thể sử dụng mèo để tạo một tệp lớn duy nhất, nhưng đây không phải là IMO tối ưu vì nó đang thêm nhiều lớp xử lý. Tôi có thể sử dụng nó như một phương sách cuối cùng, nhưng tôi đã hy vọng có những điều tôi có thể chỉnh sửa với MySQL để tránh các bước phụ ... hoặc có 64 trẻ em cố gắng viết ra đồng thời ... – user1459544

+0

Có thể bạn có thể tạo bảng cho mỗi quá trình và sáp nhập vào bảng chính khi tất cả trẻ em đã hoàn thành? – snurre

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