Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.

SQLite в производстве

Для очень-очень многих проектов нет экономического оправдания использования многих технологий и кажется что чем проще, тем лучше. SQLite предоставляет для разработчика очень простой механизм, не нужно ни настраивать пользователей, ни защищать сетевой подключение, ни обслуживать процессы, только файл в котором будет хранится данные. Что может быть проще?

По этому не удивительно, что SQLite в последнее время набирает популярность не только на локальных устройствах, но в веб приложениях, например Rails 7.1 поставляется с настроенной SQLite базой по умолчанию и с новым оптимизированным драйвером. А начиная с Laravel 11.x так же будет поставляется с SQLite по умолчанию, так как это самый простой способ начать работать и запуститься в производство.

Как и у любой базы данных есть свои особоенности и скорее всего вы познакомитесь с ними когда будете выполнять миграции и локальную разработку. По этому давайте сосредоточимся на том, что бы подготовит базу данных для работы с Laravel в производственной среде.

Одновременное чтение и запись

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

В противном случае включите режим упреждающей записи (WAL) командой:

sqlite3 database.sqlite "PRAGMA journal_mode = wal"

Этот шаг переведет вашу базу данных в режим WAL, что позволит ей эффективно обрабатывать одновременные операции чтения и записи. Вы можете убедиться в этом, выполнив следующую команду:

sqlite3 database.sqlite "PRAGMA journal_mode"

Если результатом является wal, это означает, что база данных успешно переведена в режим предварительной записи.

Удаление данных

По умолчанию SQLite физичиски не удаляет данные, по этому размер файла может сильно расти, что бы осовободить неиспользуемое дисковое пространство необходимо выполнить команду vacuum:

sqlite3 database.sqlite "PRAGMA vacuum;"

Перед выполнением база данных будет автоматически скопирована, чтобы избежать блокировки работы приложения. Однако это означает, что для выполнения операции потребуется свободное дисковое пространство, превышающее размер исходной базы данных в два раза.

Оптимизация

Чтобы добиться наилучшей долгосрочной производительности запросов без необходимости проведения детального технического анализа схемы необходимо выполнять команду оптимизации:

sqlite3 database.sqlite "PRAGMA optimize;"

Лучше всего выполнять эту команду с переодичностью, например каждый час.

Синхронизация

По умолчанию SQLIte синхронизирует журнал отказа после каждого запроса на изменение, что бы гарантировать, что весь контент безопасно записан на диск, однако это не всегда необходимо, можно изменить этот режим выполнив первым запросом в соединении:

sqlite3 database.sqlite "PRAGMA synchronous = normal;"

Это будет иметь эффект только на конкретное соединение, по этому вам скорее всего потребуется внести изменения в ваш код.

Использование в Laravel

Теперь, когда мы ознакомились с этими командами, настало время внедрить их в наше приложение на Laravel для максимального удобства. Например, вместо настройки новых задач на уровне сервера, сделать это на уровне приложения:

$schedule->command('sqlite:optimize')->everyMinute();
$schedule->command('sqlite:vacuum')->daily();

Cпециально для этих целей создал пакет небольшой Composer, который позволяет вызывать каждую из них легко с помощью Artisan:

Пакет добавляющий инструменты для эффективного использования SQLite в Laravel

Не стесняйтесь присоединиться к развитию проекта и делиться своим опытом использования!

Александр Черняев

Я здесь для тебя

0

Вакансии

Спонсоры

Помощь в разработке вашего проекта на Laravel

Независимо от сложности проекта эти кампании помогают сообществу и всем его участникам воплощать идеи в элегантные приложения.

Присоединиться

Инструменты для управления эмоциями, которые помогают людям контролировать свою жизнь и лучше понимать себя.

Перейти

Подкасты c зажигательными эпизодами, которые заставят задуматься и приведут к новым перспективам.

Перейти