2010-06-28 43 views
7

Vì vậy, tôi có một cơ sở dữ liệu nơi có rất nhiều dữ liệu được chèn từ một ứng dụng java. Usualy tôi chèn vào table1 lấy id cuối cùng, sau đó lại chèn vào table2 và lấy id cuối cùng từ đó và cuối cùng chèn vào table3 và lấy id đó và làm việc với nó trong ứng dụng. Và tôi chèn khoảng 1000-2000 hàng dữ liệu cứ 10-15 phút một lần.Chèn rất nhiều dữ liệu vào cơ sở dữ liệu trong các chèn rất nhỏ

Và sử dụng rất nhiều chèn nhỏ và lựa chọn trên một máy chủ web sản xuất không thực sự tốt, bởi vì nó đôi khi bogs xuống máy chủ.

Câu hỏi của tôi là: có cách nào để chèn nhiều dữ liệu vào bảng 1, table2, table3 mà không sử dụng số lượng lớn các lựa chọn và chèn không? Có một kỹ thuật sql-fu tôi đang thiếu?

Trả lời

5

Vì có thể bạn đang dựa vào các khóa chính auto_increment, bạn phải thực hiện chèn một lần tại một thời điểm, ít nhất là cho table1 và table2. Bởi vì MySQL sẽ không cung cấp cho bạn nhiều hơn khóa cuối cùng được tạo ra.

Bạn không bao giờ phải chọn. Bạn có thể lấy id được chèn cuối cùng từ Tuyên bố bằng cách sử dụng phương thức getGeneratedKeys(). Xem ví dụ cho thấy này trong cuốn hướng dẫn MySQL cho Connector/J:

http://dev.mysql.com/doc/refman/5.1/en/connector-j-usagenotes-basic.html#connector-j-examples-autoincrement-getgeneratedkeys

khuyến nghị khác:

  • Sử dụng đa hàng INSERT cú pháp cho table3.
  • Sử dụng ALTER TABLE DISABLE KEYS khi bạn đang nhập và bật lại chúng khi bạn hoàn tất.
  • Sử dụng giao dịch rõ ràng. I E. bắt đầu một giao dịch trước khi tải dữ liệu của bạn thường xuyên, và cam kết ở cuối. Tôi cũng có thể cam kết sau mỗi 1000 hàng của table1.
  • Sử dụng câu lệnh đã chuẩn bị.

Thật không may, bạn không thể sử dụng phương pháp nhanh nhất để tải hàng loạt dữ liệu, LOAD DATA INFILE, bởi vì điều đó không cho phép bạn nhận giá trị id được tạo mỗi hàng.

2

Có rất nhiều để nói về ở đây:

  1. Đó là khả năng là độ trễ mạng là giết chết bạn nếu mỗi người trong số những BIG là một khứ hồi mạng. Hãy thử xử lý các yêu cầu của bạn để chúng chỉ yêu cầu một vòng khứ hồi cho toàn bộ giao dịch.
  2. Nói về giao dịch, bạn không đề cập đến chúng. Nếu tất cả ba trong số các INSERT đó cần phải là một đơn vị công việc duy nhất, bạn nên xử lý các giao dịch đúng cách. Nếu bạn không biết làm thế nào, tốt hơn nghiên cứu chúng.
  3. Hãy thử yêu cầu lưu vào bộ nhớ cache nếu chúng được sử dụng lại nhiều. Vòng xoay nhanh nhất là chuyến đi bạn không thực hiện.
1

Bạn có thể thiết kế lại cơ sở dữ liệu của mình sao cho khóa chính không phải là giá trị gia tăng tự động do cơ sở dữ liệu tạo ra mà là UUID được tạo bởi khách hàng. Sau đó, bạn có thể tạo ra tất cả các phím cho mỗi bản ghi trả trước và hàng loạt các chèn tuy nhiên bạn thích.

+0

ý tưởng hay, nhưng có một nhưng ... thời gian để thiết kế lại cơ sở dữ liệu sẽ tốn quá nhiều thời gian. Có một thiết kế lại cơ sở dữ liệu được lên kế hoạch nhưng không phải bây giờ. – Gabriel

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