Есть возможность как-то ускорить INSERT INTO в SQLite на php?

программирование php базы данных sql SQLite

Потребовалось добавить в базу несколько сотен тысяч строк. Значит в папке 91 файл (.txt) общий размер которых составляет 7.1 мб. Задачу я эту выполнил, но осадок остался. Это слишком долго! Очень долго! Я не ожидал что процесс на столько будет долгим.
Файлов: 91 (7.1 мб)
Общие количество строк: 315091
Время: 5 ч 30 м 38 с

Это заняло 5 с половиной часов! Длина одной строки, не превышает 100 символов. У меня размер файла базы данных (.db) каждую секунду увеличивался ровно на 1024 байта. Запрос был самый простой:
sqlite_query($db, "INSERT INTO '".$city_name."' (city, code)
VALUES ('".$result."', '".$match[1]."')");

На будущие, это можно как-то ускорить? Я помню что sqlite записывает в один поток (процесс). но в интернете видел статью по ускорению, но это на делфи.

Примечание:
Использовал по той причине, что мне нужна переносная (портативная) база. Которую можно просто скопировать и начать читать с неё. Мне необходимо было заполнить её и уже дальше только читать с неё без добавления данных. Мне показалось, что sqlite удачный выбор в этом плане, чем mysql. Тем более как я говорил мне её нужно использовать только на чтение а она по статистике показывает отличные результаты на выборку для чтения.
Ответы:
Не используй SQLite.
Могу предложить:
1. увеличить кэш.
2. убирать индексы на время вставки.
SQLite всё-таки не предназначен для таких нагрузок. Поэтому наилучшим решением будет перейти на использование другой БД.
#1
Сервер с PHP вы тоже с собой носите чтоли ? Если уж Вам потребовалось мобильное приложение, то, наверное, лучше было бы использовать базу данных на основе json или xml-файлов. Хотя SQLite тоже неплохой вариант.
У всех переносных баз общий недостаток - это проблема с одновременным доступом и скоростью. Например, если бы Вы хранили данные тупо в файле, то получили бы скорость на порядок выше, чем чтение с SQLite.
1) Если хочешь мобильную БД, то используй Firebird Embeded, причем сама БД будет та же самая, что и для полноценной сетевой версии. Embeded не требует установки и подключается к Бд в монопольном режиме.
2) Скорость вставки записей практически не зависит от размера строки, а много больше зависит от наличия и размера индексов. При КАЖДОЙ вставке значение проверяется по индексу и в индекс добавляется новое значение. Как правило при этом индекс разбалансируется. Поэтому его периодически нужно перестраивать - например удалить/построить.
Один из вариантов - отключить индексы на время вставки, но при этом также отключаются проверки. А после вставки создать индексы снова. Так например делают программы backup/restore
Я не знаю как оно там а пхп  сделано, но тормоза скорее всего потому, что после каждого INSERT'а делается COMMIT. Кучу данных надо вставлять одной транзакцией. Сядь и разберись как в пхпшных биндингах к sqlite'у управлять транзакциями. И, как правильно выше подсказали, временно отключить индексы, если они есть. 7 метров текста для sqlite'а - это семечки. Должно вставляться секунд за 10.
У меня приличная база моих "исследований", таскаю на флешке в sqlite3. После того, как помучился с большими списками инсертов, поискал - мне подсказали. Пишете BEGIN; insert....;  insert...; insert....; COMMIT и всё работает гораздо быстрее. Не нужно все over9000  инсерты включать в транзакцию, я беру по 200-500 инсертов ;)


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.