Brutal insert speed optimization by bypassing the ORM completely

This commit is contained in:
2018-08-12 23:49:52 +02:00
parent 13b22f7cb4
commit c76fc21820
4 changed files with 48 additions and 34 deletions
+13 -4
View File
@@ -193,11 +193,20 @@ class Proposal extends BaseModel
// --- Insert new rows ---
if ($changeset->newRows) {
$newRowData = [];
foreach ($changeset->newRows as $newRow) {
$newRowData[] = new Row(['data' => $newRow]);
$conn = DB::connection();
$prepared = $conn->getPdo()->prepare('INSERT INTO rows (data) VALUES (?)');
foreach (array_chunk($changeset->newRows, 10000) as $i => $chunk) {
$ids = [];
foreach ($chunk as $newRow) {
$prepared->execute([json_encode($newRow)]);
$ids[] = $conn->getPdo()->lastInsertId();
}
$qms = rtrim(str_repeat('('.$newRevision->id.', ?),', count($ids)), ',');
$conn->statement('INSERT INTO revision_row_pivot (revision_id, row_id) VALUES '.$qms.';',
$ids);
}
$newRevision->rows()->saveMany($newRowData);
}
$newRevision->update(['row_count' => $newRevision->rows()->count()]);