Это довольно быстро для 6 миллионов записей.
Кажется, что вы делаете это правильно, некоторое время назад я читал на sqlite.org, что при вставке записей вам нужно поместить эти вставки в транзакцию, если вы не сделаете этого, ваши вставки будут ограничены только до 60 в секунду! Это связано с тем, что каждая вставка будет обрабатываться как отдельная транзакция, и каждая транзакция должна ожидать полного вращения диска. Вы можете прочитать полное объяснение здесь:
http://www.sqlite.org/faq.html#q19
На самом деле, SQLite будет легко выполнять 50 000 или более операторов INSERT в секунду на обычном настольном компьютере. Но он будет делать только несколько десятков транзакций в секунду. Скорость транзакции ограничена скоростью вращения вашего дисковода. Транзакция обычно требует двух полных оборотов дискового диска, что на диске 7200 об / мин ограничивает до 60 транзакций в секунду.
Сравнение вашего времени со средним, указанным выше: 50 000 в секунду =>, что должно занять 2 м 00 сек. Который только немного быстрее, чем ваше время.
Скорость транзакции ограничена скоростью диска, потому что (по умолчанию) SQLite фактически ожидает, пока данные действительно не будут безопасно сохранены на поверхности диска, прежде чем транзакция будет завершена. Таким образом, если вы вдруг потеряете питание или ваша ОС выйдет из строя, ваши данные останутся в безопасности. Подробнее читайте об атомарной фиксации в SQLite.
По умолчанию каждый оператор INSERT является собственной транзакцией. Но если вы окружите несколько операторов INSERT с помощью BEGIN ... COMMIT, тогда все вставки будут сгруппированы в одну транзакцию. Время, необходимое для фиксации транзакции, амортизируется по всем вложенным операторам вставки, поэтому время на оператор вставки значительно сокращается.
В следующем абзаце есть подсказка, что вы можете попытаться ускорить вставку:
Другой вариант - запустить PRAGMA синхронно = OFF. Эта команда приведет к тому, что SQLite не будет ждать, пока данные достигнут поверхности диска, что сделает операции записи намного более быстрыми. Но если вы потеряете мощность в середине транзакции, файл базы данных может испортиться.
Я всегда думал, что SQLite был разработан для "простых вещей", 6 миллионов записей мне кажется работой для какого-то реального сервера баз данных, такого как MySQL.
Подсчет записей в таблице в SQLite с таким количеством записей может занять много времени, просто для вашей информации, вместо того чтобы использовать SELECT COUNT (*), вы всегда можете использовать SELECT MAX (rowid), который очень быстрый, но не очень так точно, если вы удаляете записи в этой таблице.
EDIT.
Как сказал Майк Вудхаус, создание индекса после того, как вы вставили записи, должно ускорить все это, что является общим советом в других базах данных, но не может точно сказать, как он работает в SQLite.