php sqlite3 очень медленно записывает данные в таблицу insert

База данных на PHP SQLite очень медленно будет записывать данные в бд с помощью INSERT. Если данных несколько миллионов этот процесс может занять и даже 1 час.
Чтобы увеличить скорость нужно не использовать режим синхронизации БД synchronous = off и журнал установив в значение journal_mode=wal
Устанавливем режим BEGIN .. COMMIT для ускорения записи. Может потребоваться больше памяти, чем обычно.

Вот решение:
$db=new SQLite3("test.db");
$db->exec('PRAGMA journal_mode=wal;');
$db->exec('PRAGMA synchronous = off;'); 
$db->exec('BEGIN;CREATE TABLE IF NOT EXISTS test (msg TEXT);');

$h=@fopen("какой-то-файл-с-данными.txt","r");

while ($s=fgets($h)){// читаем файл построчно и каждую строку записываем в msg
    $stmt = $db->prepare("INSERT INTO test (msg) VALUES (:s);");// делаем prepare для экранирования, если экранирование не нужно можно использовать всего одну строку вместо трех: $db->exec("INSERT INTO test (msg) VALUES ('$s');");
    $stmt->bindValue(':s', $s, SQLITE3_TEXT);
    $result = $stmt->execute();
}
$db->exec('COMMIT;');


В качестве примера, файл с 9 млн строк был записан в базу данных sqlite3 всего за 20 секунд.

прочитать то что мы записали можно так:

$result = $db->query('SELECT msg FROM test');
while($s=$result->fetchArray()){
    echo $s['msg'],"<br>";    
}


Занимательная статистика

Если обычный текстовой файл с данными в формате win1251 весил 159Мб то после перегонки его в sqlite3 файл базы данных будет весит уже 239Mb, а если сделать и уникальное поле, то еще больше. Поиск по текстовому файлу средставми php в первом случае будет быстрее.



Оставить свой ответ:

Имя:*
E-Mail:
Вопрос:
Skolko buдет пять пдюс сeмь?
Ответ:*
QQpedia21.ru - cамые интересные вопросы