Как оптимизировать время выполнения при вставке данных с помощью pdo?

Существует огромный двухмерный массив, который содержит массивы размером до 500 тыс. Юнитов, каждый из которых содержит 5 элементов. Теперь моя работа заключается в том, чтобы вставить все данные в базу данных sqlite.

function insert_data($array){ Global $db; $dbh=new PDO("sqlite:{$db}"); $sql = "INSERT INTO quote (f1,f2,f3,f4,f5) VALUES (?,?,?,?,?)"; $query = $dbh->prepare($sql); foreach($array as $item){ $query->execute(array_values($item)); } $dbh=null; } 

Я хочу оптимизировать процесс вставки данных, чтобы действие выполнения выполнялось в течение 500 тыс. Раз, как сделать его выполненным только один раз?

Related of "Как оптимизировать время выполнения при вставке данных с помощью pdo?"

Идея состоит в том, чтобы предотвратить выполнение транзакций для каждой вставки, потому что это будет очень медленно. Так что просто запустите и зафиксируйте транзакцию, скажем, за каждые 10 тыс. Записей.

 $dbh->beginTransaction(); $counter = 0; foreach($array as $item) { $query->execute(array_values($item)); if ($counter++ % 10000 == 0) { $dbh->commit(); $dbh->beginTransaction(); } } $dbh->commit(); 

Другое решение, вы можете переместить массив в файл csv, а затем просто импортировать его.

Если вы используете более новую версию Sqlite (3.7.11+), она поддерживает пакетные вставки:

 INSERT INTO quote (f1,f2,f3,f4,f5) VALUES (?,?,?,?,?), (?,?,?,?,?), (?,?,?,?,?); 

Вы можете использовать это, чтобы объединить свой массив в группы и сделать пакетные вставки таким образом. Как указано Axalix, вы должны также обернуть всю операцию в транзакции.