К постам Опубликовано: 2017-07-09

База данных Sqlite, мое впечатление

Использую данную базу для работы с парсингом. Приходиться много как записывать так и извлекать данные с sqlite. Изначально была база mysql(mariaDB), причина по которой перешел - какая-то хрень с сокетом(переустановка через менеджер, перекомпиляция не помогли), это было и не критично, ну и конечно я знал что никаких сервисов не нужно устанавливать дополнительно для sqlite, только расширение для php, которое по дефолту уже установлено, кайф. Так как я работаю через Yii, то особых отличий я не чувствовал от mysql.

На данный момент размер главной базы sqlite занимает 700мб, и около 40тыс записей с 10 таблицами, это не много но достаточно чтобы посмотреть как работает это чудо. 

Для работы на локальном компе(linux x86) использовал удобную графическую оболочку которая доступна для всех ОСей. Кроме того доступна в пакетных менеджерах разных дистров, а для Убунту-based: 

sudo apt-get install sqlitebrowser

А-та-та, в sqlite3 не нравиться вот что

1. Самое первое разочарование касалось невозможности переименования столбца таблицы, или его удаление, возможно только добавление. По-этому если вы ошиблись из структурой таблицы, придется ее удалить и создать новую - что достаточно не удобно. В Mysql если что-то нужно изменить, взял и поменял в любой момент - а здесь так не выйдет(без бубна).

2. Блок всей базы, если идет запись в нее - а это же один файл. При записи в базу создается дополнительный файлик - журнал, и пока он не синхронизирован с базой - она залочена. Запись происходит очень быстро, но то чувство что ты можешь попасть как раз в тот момент когда идет вот эта запись, всегда есть. Это не приятно по той причине, что скрипт просто завершается получив ошибку о блокировке базы. Хотя при многопоточной работой с базой, вставке в краткий период множества записей с разных процессов, я не замечал что бы что-то подобное было. Я так думаю что работа из одного соединения как-то регулирует очередь, или что-то подобное.

3. Я так подумал, что можно сделать backup просто скопировав файл базы. И тут хренак, и поломалась целостность базы, так как в этот момент шла запись в базу, считать не получилось. Начал рыть как же делать тут backup(что заняло некоторое время) и оказалось что это схоже с mysql.

cd /to/your/db/path && sqlite3 yourdb.db .dump > your.dump

переходим в папку с базой, вызываем sqlite3 и используем команду .dump с перенаправлением > в файл, так как команда выводит все данные прям в консоль. Больше информации можно получить по линку.

4. При изменении схемы базы, блокируется вся база. Если у вас в этот момент велась работа с базой, она будет прервана.


Понравилось

1. Простота. Ты пишешь путь к базе, и работаешь так же как и с mysql.

2. Независимость от платформы. Захотел - перенес на винду как ни в чем не бывало, и спокойно работаешь.

3. Надежность. Если не трогать параметры sqlite(по крайней мере не зная что они делают), то база хорошо защищает ваши данные даже от сбоев электропитания или сбоев системы.


Нюансы

При удалении данных, база данных не уменьшалась, а по логике должна бы. Суть в команде VACUUM. При ее выполнении данные которые вы удалили - очищаются окончательно.

Так как база является файлом - она под прямым контролем ОС. Был казус с правами при котором даже если у базы права 777 то не было доступа к ней.  Решение - выставьте права на папку в которой лежит база.

Если базу не вынести за публичную часть приложения - ее можно будет скачать с браузера, зная путь к ней.

Выборка и сортировка с разбиением пагинации 20к записей уже происходит с паузой в несколько секунд. Хотя думаю это нормально при сортировке по 5 полям и обратной сортировкой. Более мелкое количество записей в 5к реагируют мгновенно. Запись/обновление также мгновенная. Выборка 20к записей без сортировки - в пределах 100мс.

Для быстрой вставки записей используйте WAL режим, но будьте осторожны, так как он не гарантирует надежность сохранения данных при сбоях.