Tôi cần có thể chèn từ yêu cầu biểu mẫu 10'000 + hàng tương tự cùng một lúc. Hiện tại tôi đã thực hiện nó với một tuyên bố chuẩn bị một hàng looped 10'000 lần, nơi tôi tái bindParam mỗi var.PHP PDO chèn nhiều (10000+) hàng cùng sử dụng bindParam. Thực hành tốt?
for ($i=0; $i < intval($cloneCount); $i++)
{
... 9 other bindParam
$insertG->bindParam(':v1', $v1, PDO::PARAM_STR);
$insertG->bindParam(':v2', $v2, PDO::PARAM_INT);
$insertG->execute();
}
Mất gần 30 giây để đạt được và chắc chắn không phải là thực tiễn tốt. Hôm nay là 10'000 nhưng có thể là 100'000 vào ngày mai.
Nếu tôi chèn hàng bội số trong một truy vấn với (v1,v2),(v1,v2)...
tôi cần phải ràng buộc từng giá trị với một tham số mới, do đó tôi tin rằng tôi cần phải có gần 100'000 bindedParam trong một truy vấn. Nếu đó là UTF-8 và tôi đếm khoảng 2 Byte (tôi biết nó có thể lên đến 4) cho mỗi char truy vấn của tôi sẽ được khoảng 10-20 MB và máy chủ mysql là trên máy khác. Nói điều này tôi ngạc nhiên rằng nó chỉ mất 30 giây cho yêu cầu thiết kế kém của tôi để thành công.
Có cách nào để gửi chỉ một dòng và cho máy chủ mysql sao chép hàng cuối cùng 10'000 lần không?
EDIT MỘT PHẦN GIẢI PHÁP
Sau Bill Karwin và Zsolt Szilágy lời khuyên. Tôi quản lý để có được xuống đến 5-6 giây với các tinh chỉnh sau đây cho một chèn 10'000 đến một máy chủ mysql từ xa:
$dataBase->beginTransaction();
$insertG = $dataBase->prepare('INSERT INTO G...)
...
10 * bindParam of all kinds
for ($i=0; $i < 10000; ++$i)
{
$hashKey = sha1(uniqid().$i); //$hashKey is a binded param
$insertG->execute();
}
$dataBase->commit();
Việc di chuyển phần count() ra khỏi vòng lặp không chỉ là một cải tiến nhỏ, vì PHP xử lý đếm khá chậm. Điểm tốt! Một cách thông thường để làm điều này là cho ($ i = 0, $ max = count ($ array); $ i <$ max; $ i ++) –
@ZsoltSzilagy, đúng vậy, nhưng OP không làm đếm() trong vòng lặp, ông đã làm intval(). Không gần như tốn kém như đếm(), nhưng nó vẫn là một cuộc gọi chức năng và bất kỳ cải tiến nhỏ giúp nếu bạn đang đi vòng lặp hơn 100.000 lần. –
Eah bạn đúng, tôi nên cuộn lên lần nữa. :) –