2011-09-28 21 views
5

Tôi muốn tải lên tệp csv lớn khoảng 10.000.000 bản ghi trong bảng mysql cũng chứa cùng một hoặc nhiều không. hồ sơ và một số bản ghi trùng lặp. Tôi đã cố gắng sử dụng dữ liệu cục bộ nhưng nó cũng mất nhiều thời gian hơn. Làm cách nào tôi có thể giải quyết vấn đề này mà không phải đợi lâu. Nếu nó không thể được giải quyết sau đó làm thế nào tôi có thể làm điều đó với AJAX để gửi một số hồ sơ và xử lý nó tại một thời điểm và sẽ làm điều đó cho đến khi toàn bộ csv được tải lên/proccessed.Tải lên tệp CSV lớn xấp xỉ 10.000.000 bản ghi trong bảng mysql cũng chứa hàng trùng lặp

+2

Trước tiên, bạn sẽ phải giải thích ký hiệu số mới này mà bạn đã đưa ra. – mowwwalker

+0

có phải là một tỷ hay 10 triệu? – webbiedave

+2

qua ajax sẽ chậm hơn. nếu bạn muốn các lệnh tải infile không mất quá nhiều thời gian, hãy chia nhỏ csv thành các phần nhỏ hơn. –

Trả lời

0

Hãy thử điều này:

load data local infile '/yourcsvfile.csv' into table yourtable fields terminated by ',' lines terminated by '\r\n' 
+0

OP đã nói anh ta đã thử 'tải infile' và nó quá chậm. Làm thế nào điều này thay đổi bất cứ điều gì? –

+0

Tôi đã thử điều này .. – akashdeep

+0

up, xin lỗi! Vấn đề không đọc tốt:/ – hunt

6

LOAD DATA INFILE sẽ không được đánh bại tốc độ khôn ngoan. Có một vài điều bạn có thể làm để tăng tốc độ:

  • Thả hoặc vô hiệu hóa một số chỉ mục (nhưng tất nhiên, bạn sẽ đợi chúng để tạo sau khi tải. Nhưng điều này thường nhanh hơn). Nếu bạn đang sử dụng MyISAM, bạn có thể ALTER TABLE *foo* DISABLE KEYS, nhưng InnoDB không hỗ trợ điều đó, thật không may. Thay vào đó, bạn sẽ phải thả chúng.
  • Tối ưu hóa cài đặt my.cnf của bạn. Đặc biệt, bạn có thể vô hiệu hóa rất nhiều thứ an toàn (như fsync). Tất nhiên, nếu bạn gặp sự cố, bạn sẽ phải khôi phục bản sao lưu và bắt đầu tải lại. Ngoài ra, nếu bạn đang chạy my.cnf mặc định, cuối cùng tôi đã kiểm tra khá tối ưu của nó cho một máy cơ sở dữ liệu. Rất nhiều hướng dẫn điều chỉnh được xung quanh.
  • Mua phần cứng nhanh hơn. Hoặc thuê một số (ví dụ: hãy thử một ví dụ nhanh về ECC của Amazon).
  • Như đề cập @ZendDevel, hãy xem xét các giải pháp lưu trữ dữ liệu khác, nếu bạn không bị khóa vào MySQL. Ví dụ, nếu bạn chỉ lưu trữ một danh sách các số điện thoại (và một số dữ liệu với chúng), một bảng băm đơn giản sẽ nhanh hơn nhiều lần.

Nếu vấn đề là nó giết hiệu suất cơ sở dữ liệu, bạn có thể chia tệp CSV thành nhiều tệp CSV và tải chúng theo khối.

+0

Thực ra tôi đang đối phó với giải pháp danh sách trắng cho số điện thoại di động trong một trung tâm cuộc gọi và tôi phải tải lên nhiều dữ liệu này mỗi ngày (các hàng trùng lặp ở đó). – akashdeep

+0

@ user969923: Nghe có vẻ như bạn có thể kết hợp tối ưu hóa my.cnf nếu điều đó chưa được thực hiện và mua phần cứng nhanh hơn. Các Serverfault folks có thể giúp bạn nhiều hơn với các chi tiết cụ thể. – derobert

+0

Tôi có thể làm gì với BẢNG HASH. Tôi chỉ có 5 trường và chỉ một trường là khóa chính (số di động). Hãy cho tôi một số ví dụ. – akashdeep

0

Tùy thuộc vào công cụ lưu trữ của bạn, quá trình này có thể mất nhiều thời gian. Tôi đã nhận thấy rằng với MYISAM nó đi nhanh hơn một chút. Tôi vừa thử nghiệm với cùng một tập dữ liệu chính xác và cuối cùng tôi đã đi với PostgreSQL vì nó mạnh mẽ hơn khi tải tệp. Innodb quá chậm nên tôi đã hủy bỏ nó sau hai giờ với cùng một tập dữ liệu kích thước nhưng nó là 10.000.000 bản ghi bởi 128 cột đầy dữ liệu.

0

Vì đây là danh sách trắng đang được cập nhật hàng ngày, điều này không có nghĩa là có một số lượng rất lớn các bản sao (sau ngày đầu tiên)? Nếu đây là trường hợp nó sẽ làm cho việc tải lên nhanh hơn rất nhiều để thực hiện một kịch bản lệnh đơn giản để kiểm tra xem bản ghi đã tồn tại chưa trước khi chèn nó.

0

Hãy thử truy vấn này:

$sql="LOAD DATA LOCAL INFILE '../upload/csvfile.csv' 
INTO TABLE table_name FIELDS 
TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' " 
Các vấn đề liên quan