Bạn không cần phải bindParam () trong mỗi lần lặp lại của vòng lặp. BindParam () khiến các biến $ v1, $ v2, v.v. bị ràng buộc bởi tham chiếu , vì vậy tất cả những gì bạn cần làm là thay đổi giá trị của các biến này và sau đó thực hiện lại truy vấn. Điều đó có thể cắt giảm chi phí.
Ngoài ra, bạn có thể tránh gọi intval () mọi lúc qua vòng lặp. Chỉ cần đảm bảo $ cloneCount được ép buộc thành số nguyên một lần , trước vòng lặp. Đó là một cải tiến rất nhỏ, nhưng đó là một phương pháp hay.
$cloneCount = (int) $cloneCount;
... 9 other bindParam
$insertG->bindParam(':v1', $v1, PDO::PARAM_STR);
$insertG->bindParam(':v2', $v2, PDO::PARAM_INT);
for ($i=0; $i < $cloneCount; $i++)
{
$v1 = /* something */
$v2 = /* something */
$insertG->execute();
}
Bạn cũng nên tránh tự động gửi. Giảm chi phí giao dịch của MySQL trên mỗi lần thực thi câu lệnh bằng cách bắt đầu một giao dịch rõ ràng , chèn vài nghìn hàng và sau đó thực hiện giao dịch.
Nhưng cách tốt nhất để tăng tốc độ CHÈN hàng loạt hàng nghìn hàng tương tự vào một bảng duy nhất là sử dụng TẢI THÔNG TIN ĐỊA PHƯƠNG DỮ LIỆU thay vì CHÈN. Điều này chạy nhanh hơn 10-20 lần so với CHÈN từng hàng, ngay cả khi bạn sử dụng tham số, giao dịch, chèn nhiều hàng và bất kỳ thủ thuật nào khác mà bạn có thể nghĩ ra.
Ngay cả khi bạn phải sử dụng PHP để ghi dữ liệu của mình vào tệp .CSV vào đĩa và sau đó sử dụng TẢI DỮ LIỆU ĐỊA PHƯƠNG INFILE trên tệp đó, nó vẫn nhanh hơn nhiều.
Xem thêm Tốc độ của câu lệnh CHÈN trong hướng dẫn sử dụng MySQL để biết thêm các mẹo.