2011-07-23 32 views
7

Tôi đang tạo tập lệnh PHP để nhập một số dữ liệu từ tệp văn bản vào cơ sở dữ liệu MySQL. Các tệp văn bản này khá lớn, một tệp trung bình sẽ có 10.000 dòng trong đó mỗi tệp tương ứng với một mục mới mà tôi muốn trong cơ sở dữ liệu của mình. (Tôi sẽ không nhập tệp thường xuyên)Tôi có nên giới hạn tốc độ hoặc giảm các truy vấn cơ sở dữ liệu của mình không?

Tôi lo lắng rằng đọc một dòng từ tệp và sau đó thực hiện truy vấn INSERT, 10.000 lần liên tiếp có thể gây ra một số vấn đề. Có cách nào tốt hơn cho tôi để làm điều này? Tôi có nên thực hiện một truy vấn INSERT với tất cả 10.000 giá trị không? Hay điều đó cũng tệ như vậy?

Có thể tôi có thể tiếp cận một phương tiện và thực hiện khoảng 10 hoặc 100 mục cùng một lúc. Thực sự vấn đề của tôi là tôi không biết thực hành tốt là gì. Có lẽ 10.000 truy vấn liên tiếp là tốt và tôi chỉ lo lắng cho không có gì.

Mọi đề xuất?

Trả lời

6

có nó là

<?php 
$lines = file('file.txt'); 
$count = count($lines); 
$i = 0; 
$query = "INSERT INTO table VALUES "; 
foreach($lines as $line){ 
    $i++; 
    if ($count == $i) { 
     $query .= "('".$line."')"; 
    } 
    else{ 
     $query .= "('".$line."'),"; 
    } 
} 
echo $query; 

http://sandbox.phpcode.eu/g/5ade4.php

này sẽ làm cho một truy vấn duy nhất, đó là nhiều nhanh hơn so với phong cách một dòng-one-truy vấn!

+0

+1 Nội dung thú vị, thích nó. – Mattis

+0

cảm ơn! có vẻ như một truy vấn lớn hơn là một ý tưởng hay! – nate

+3

Nhưng hãy cẩn thận, vì kích thước của truy vấn phải nhỏ hơn tham số max_allowed_packet của bạn cho máy chủ! (xem my.ini) – spacediver

2

Tôi sẽ làm điều đó trong một truy vấn lớn với tất cả các giá trị cùng một lúc. Tuy nhiên, hãy chắc chắn rằng bạn chạy START TRANSACTION; trước và COMMIT; để nếu xảy ra sự cố trong khi thực hiện truy vấn (có thể vì nó sẽ chạy trong một thời gian khá dài), cơ sở dữ liệu sẽ không bị ảnh hưởng.

+0

hãy cẩn thận khi phát hành chèn nhiều lần sẽ giảm khả năng theo dõi lỗi của bạn. nếu một trong các hàng không chèn được, bạn sẽ không thể phát hiện lỗi nào đã kích hoạt lỗi (và tất nhiên, sẽ làm giảm toàn bộ công việc hàng loạt thay vì ít nhất là có hàng tốt) – marcelog

+0

Đúng. Tôi giả sử tất cả các dữ liệu được chèn vào là sane, vì vậy không có hàng nào không chèn được. Việc xác nhận phải được thực hiện trên dữ liệu trước khi nó được thêm vào chuỗi truy vấn để đảm bảo điều này. – EdoDodo

+0

IMNSHO, mất toàn bộ giao dịch là thích hợp hơn cho một giao dịch được cam kết một phần. Nếu xác thực có thể là vấn đề, tôi cố gắng giải quyết điều đó trong khuôn khổ của một giao dịch, ví dụ bằng cách chèn vào bảng tạm thời, truy vấn giữa dữ liệu mới và dữ liệu hiện có cho các hàng xung đột và sau đó chuyển dữ liệu từ bảng tạm thời đến bảng chính khi tôi chắc chắn mọi thứ đều là A-OK. điều này sẽ là tốt nhất của cả hai thế giới (với chi phí phức tạp mã hơi lớn hơn) – SingleNegationElimination

5

Sử dụng câu lệnh đã chuẩn bị, được đề xuất bởi các tác giả của Hiệu suất cao MySQL. Nó tiết kiệm rất nhiều thời gian (tiết kiệm từ giao thức lãng phí và mã SQL ASCII).

+0

Oh nice! Tôi không có ý tưởng gì như thế này tồn tại.Tôi sẽ def. sử dụng báo cáo đã chuẩn bị cho việc nhập của tôi. Cảm ơn! – nate

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