2008-09-21 12 views
9

Tôi đã có mã C# truy cập MySQL thông qua ODBC.Giao dịch MySQL với hàng ngàn Phụ trang - có bao nhiêu "chuyến đi khứ hồi"?

Nó tạo giao dịch, thực hiện một vài nghìn lệnh chèn và sau đó cam kết. Bây giờ câu hỏi của tôi là bao nhiêu "chuyến đi khứ hồi", để nói chuyện, xảy ra với máy chủ DB? Tôi có nghĩa là, nó chỉ đơn giản là truyền tải mọi lệnh chèn vào máy chủ DB, hay nó cache/đệm chúng và gửi chúng theo lô? Và cấu hình này có thể được cấu hình theo bất kỳ cách nào không?

Trả lời

18

MySQL có một phong cách SQL mở rộng có thể được sử dụng, nơi chèn khối lượng được đặt ở một số tại một thời điểm:

INSERT INTO `table` (`id`, `event`) VALUES (1, 94263), (2, 75015), (3, 75015); 

Tôi thường sẽ thu thập một vài trăm chèn-bộ phận thành một chuỗi trước khi chạy SQL truy vấn. Điều này sẽ làm giảm chi phí phân tích cú pháp và truyền thông bằng cách tự chúng theo đợt.

+1

Bất kỳ ý tưởng có bao nhiêu bộ ngoặc đơn(),(),() được coi là 'lớn'? Điều tôi muốn hỏi là sau khi có bao nhiêu hàng chèn mở rộng (= bộ ngoặc đơn sau VALUES) trong truy vấn 1, chúng ta có nên xem xét tạo truy vấn mới không? – Swanand

+1

Nó phụ thuộc vào kích thước của dữ liệu, nhưng nó là một sự lộn xộn giữa sự lựa chọn cá nhân và giới hạn lưu lượng cơ sở dữ liệu (ví dụ như kích thước tối đa cho phép của gói tin Mysql). Tôi thường làm một nơi nào đó khoảng 100. Nó chỉ là một chút thời gian thêm nếu có ít hơn cho mỗi gói, và tôi không muốn có nguy cơ bất kỳ vấn đề. –

0

Thật khó để nói mà không nhìn thấy mã của bạn, nhưng tôi giả sử bạn đang thực hiện các câu lệnh một lần. Vì vậy, bạn sẽ nhận được một chuyến đi khứ hồi cho mỗi câu lệnh chèn.

Trong MSSQL bạn có thể thực hiện nhiều chèn trong một tuyên bố duy nhất:

cmd.ExecuteNonQuery "insert table values (1) insert table values (2)" 

Vì vậy, bạn có thể tạo ra một chuỗi lớn và thực hiện nó (Tôi nghĩ rằng nó sẽ có một giới hạn), tôi giả sử này sẽ làm việc cho MySQL .

Cũng trong MSSQL bạn có một trình tự chèn (tra cứu "SqlBulkCopy"), trong MySQL có thể thử loading the data from a temp file.

+0

Tôi không biết về kết nối ODBC của MySQL, nhưng bản thân MySQL cho phép concat một số lệnh trong một lần thực thi duy nhất. Ngoài ra, bạn có thể làm smth. như "INSERT INTO table VALUES ('hello', 'bye'), ('what', 'ever');" để trả lời câu hỏi của nickf với thông tin đã cho là hơi khó. :) – hangy

2

Thực hiện một chuyến đi khứ hồi cho mỗi truy vấn bạn gửi (bất kể nó có trong giao dịch hay không). Có thể, trong MySQL, để sử dụng cú pháp "chèn mở rộng" cho phép bạn chèn một số (hoặc thực sự, nhiều) hàng trong một câu lệnh đơn lẻ. Điều này thường được coi là một điều tốt.

0

Khi sử dụng MySQL 4.x một vài năm trước, chúng tôi đã gặp phải giới hạn cứng về kích thước truy vấn không thể định cấu hình được.

Điều này có lẽ sẽ không giúp bạn nhiều như:

  1. Tôi không nhớ những gì giới hạn cứng là.
  2. Có thể bạn không sử dụng MySQL 4.x.
  3. Chúng tôi đã không sử dụng giao dịch.

Chúc may mắn!

2

Chuyến đi khứ hồi tới máy chủ DB không giống với chuyến đi khứ hồi tới cơ sở dữ liệu trên đĩa.

Trước khi bạn quyết định rằng các chuyến đi khứ hồi là một nút cổ chai, hãy thực hiện một số phép đo thực tế.

Có nhiều cách để chèn nhiều hàng bằng một lần chèn, tùy thuộc vào DBMS của bạn. Trước khi bạn đầu tư nỗ lực mã hóa, hãy tìm hiểu xem nó có khả năng làm bạn tốt hay không.

0

Tùy thuộc vào nơi bạn gọi câu lệnh SQL. Tôi đã thử nó một lần với trình điều khiển MySQL JDBC và có một lỗi nói rằng giới hạn là 1MB nhưng nó có thể cấu hình được.

Tôi không bận tâm cố gắng định cấu hình và chỉ tách các câu lệnh SQL thành các phần nhỏ hơn.

4

Không có giới hạn về số lượng hàng trên mỗi lần; Giới hạn là số byte được truyền tới máy chủ.

Bạn có thể tạo số lượng lớn chèn tối đa số byte được chỉ định trong 'gói tối đa được phép'. Nếu tôi muốn sử dụng số lượng ít nhất của chèn tôi sẽ cố gắng đó.

0

Giới hạn dữ liệu sẽ gửi phụ thuộc vào máy chủ của bạn để độ dài tối đa của nhiều câu lệnh chèn được điều chỉnh tự động để phù hợp. Nút cổ chai là chiều dài gói và chiều dài bộ đệm.

Xem net_buffer_lengthmax_allowed_packet giới thiệu biến cho biết thêm:

https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_net_buffer_length https://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_allowed_packet

Trong một số trường hợp, bạn có thể điều chỉnh các (ví dụ như khi đổ dữ liệu) để không tạo ra chèn quá dài nhưng bảo tồn nhiều chèn. Lưu ý rằng nếu bạn có một số đốm màu trong bảng hoặc bất kỳ giá trị dài khác nào có thể vượt quá giá trị của các biến được đề cập, bạn có thể gặp lỗi hoặc dữ liệu không đầy đủ.