Существует огромный двухмерный массив, который содержит массивы размером до 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 тыс. Раз, как сделать его выполненным только один раз?
Идея состоит в том, чтобы предотвратить выполнение транзакций для каждой вставки, потому что это будет очень медленно. Так что просто запустите и зафиксируйте транзакцию, скажем, за каждые 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, вы должны также обернуть всю операцию в транзакции.