Tôi đã viết các tập lệnh PHP để tải hàng loạt dữ liệu được xuất bản bởi kết xuất dữ liệu Stack Overflow. Tôi nhập hàng triệu hàng và không mất nhiều thời gian.
Dưới đây là một số mẹo:
-
Không dựa vào tự động gửi. Chi phí bắt đầu và cam kết giao dịch cho mỗi hàng là rất lớn. Sử dụng các giao dịch rõ ràng và cam kết sau mỗi 1000 hàng (hoặc hơn).
-
Sử dụng câu lệnh đã chuẩn bị sẵn. Vì về cơ bản bạn đang thực hiện cùng một lần chèn hàng nghìn lần, bạn có thể chuẩn bị mỗi lần chèn trước khi bắt đầu lặp, sau đó thực thi trong suốt vòng lặp, chuyển các giá trị dưới dạng tham số. Tôi không biết cách thực hiện việc này với thư viện cơ sở dữ liệu của CodeIgniter, bạn sẽ phải tìm ra.
-
Điều chỉnh MySQL để nhập. Tăng bộ đệm cache, v.v. Xem Tốc độ của câu lệnh INSERT để biết thêm thông tin.
-
Sử dụng THÔNG TIN DỮ LIỆU TẢI. Nếu có thể. Nó thực sự nhanh hơn 20 lần so với việc sử dụng INSERT để tải dữ liệu theo từng hàng. Tôi hiểu nếu bạn không thể vì bạn cần lấy id chèn cuối cùng, v.v. Nhưng trong hầu hết các trường hợp, ngay cả khi bạn đọc tệp CSV, sắp xếp lại và ghi nó ra nhiều tệp CSV tạm thời, tải dữ liệu vẫn nhanh hơn so với sử dụng INSERT.
-
Thực hiện ngoại tuyến. Không chạy các tác vụ kéo dài trong khi yêu cầu web. Thời hạn của một yêu cầu PHP sẽ chấm dứt công việc, nếu không phải hôm nay thì thứ Ba tuần sau khi công việc còn 10%. Thay vào đó, hãy thực hiện công việc yêu cầu web xếp hàng, sau đó trả lại quyền kiểm soát cho người dùng. Bạn nên chạy quá trình nhập dữ liệu dưới dạng máy chủ và định kỳ cho phép người dùng xem nhanh tốc độ tiến trình. Ví dụ:một cách rẻ tiền để làm điều này là nhập tập lệnh nhập của bạn để xuất "." vào tệp tạm thời, và sau đó người dùng có thể yêu cầu xem tệp tạm thời và tiếp tục tải lại trong trình duyệt của họ. Nếu bạn muốn trở nên lạ mắt, hãy làm điều gì đó với Ajax.