Почему SQLite так хорош для периферии
Все уже знают, что SQLite великолепен. Эта статья делает похвалу гораздо более конкретной — она объясняет, почему мы, разработчики libSQL, считаем, что SQLite — отличный выбор для доведения ваших данных до края.
Это легкий
Индустрия программного обеспечения имеет привычку прыгать между переоценкой и недооценкой продуктов с небольшим объемом памяти. Это был важный фактор в те времена, когда оперативная память настольных компьютеров считалась в килобайтах, а затем ею стали пренебрегать, поскольку аппаратное обеспечение стало дешевле и мощнее. Тенденция вернулась, когда мы начали писать ПО для мобильных устройств с ограниченным объемом оперативной памяти — пока производители не продолжили комплектовать их еще и гигабайтами оперативной памяти и хранилища. Теперь бессерверные функциональные среды, такие как Fermyon Spin и Cloudflare Workers, которые требуют, чтобы ваши приложения были как можно более компактными. Причина, по которой они это делают, проста: если вы можете упаковать в два раза больше экземпляров вашего приложения на один сервер, вы также сократите затраты на оборудование примерно вдвое. Как SQLite вписывается в картину? Он просто на несколько порядков легче аналогичных продуктов, таких как Postgres.
На момент написания статьи предельный размер двоичного файла Cloudflare Worker для развертывания составлял 5 МБ после сжатия. Посмотрим, как SQLite и Postgres уложатся в лимит:
Конечно, Postgres гораздо более тяжеловесен из-за всего его сетевого кода, расширений, утилит и так далее. Но факт остается фактом — вы можете втиснуть ~10 экземпляров SQLite в машину вместо одной установки Postgres, и в некоторых средах это считается!
Это быстро
Скорость, конечно, понятие относительное, но SQLite действительно является высокооптимизированной библиотекой баз данных. Практически невозможно сравнить его с сетевыми системами управления базами данных, такими как MySQL или Postgres, потому что SQLite — это библиотека, которая работает с локальным файлом — она обходит все затраты, связанные с сетью, уровни сериализации и десериализации, аутентификацию, авторизацию и многое другое. .
Тем не менее имеет смысл оценить производительность базы данных, которую вы хотите использовать. SQLite поставляется с полезной утилитой под названием speedtest1, которая идеально подходит для получения быстрого обзора производительности базы данных с вашей настройкой:
$ ./speedtest1 --size 5 100 - 2500 INSERTs into table with no index....................... 0.006s 110 - 2500 ordered INSERTS with one index/PK...................... 0.009s 120 - 2500 unordered INSERTS with one index/PK.................... 0.010s 130 - 25 SELECTS, numeric BETWEEN, unindexed...................... 0.007s 140 - 10 SELECTS, LIKE, unindexed................................. 0.008s 142 - 10 SELECTS w/ORDER BY, unindexed............................ 0.007s 145 - 10 SELECTS w/ORDER BY and LIMIT, unindexed.................. 0.004s 150 - CREATE INDEX five times..................................... 0.005s 160 - 500 SELECTS, numeric BETWEEN, indexed....................... 0.001s 161 - 500 SELECTS, numeric BETWEEN, PK............................ 0.001s 170 - 500 SELECTS, text BETWEEN, indexed.......................... 0.002s 180 - 2500 INSERTS with three indexes............................. 0.003s 190 - DELETE and REFILL one table................................. 0.003s 200 - VACUUM...................................................... 0.006s 210 - ALTER TABLE ADD COLUMN, and query........................... 0.000s 230 - 500 UPDATES, numeric BETWEEN, indexed....................... 0.001s 240 - 2500 UPDATES of individual rows............................. 0.002s 250 - One big UPDATE of the whole 2500-row table.................. 0.001s 260 - Query added column after filling............................ 0.000s 270 - 500 DELETEs, numeric BETWEEN, indexed....................... 0.002s 280 - 2500 DELETEs of individual rows............................. 0.003s 290 - Refill two 2500-row tables using REPLACE.................... 0.009s 300 - Refill a 2500-row table using (b&1)==(a&1).................. 0.004s 310 - 500 four-ways joins......................................... 0.005s 320 - subquery in result set...................................... 0.003s 400 - 3500 REPLACE ops on an IPK.................................. 0.002s 410 - 3500 SELECTS on an IPK...................................... 0.003s 500 - 3500 REPLACE on TEXT PK..................................... 0.002s 510 - 3500 SELECTS on a TEXT PK................................... 0.003s 520 - 3500 SELECT DISTINCT........................................ 0.002s 980 - PRAGMA integrity_check...................................... 0.009s 990 - ANALYZE..................................................... 0.001s TOTAL....................................................... 0.124s
На момент написания этой статьи ограничение времени для Cloudflare Worker составляет 10 мс. Этого достаточно для 2500 вставок в базу данных и пары сотен выборок сверху! Звучит на порядки больше, чем требуется для вашей типичной реализации корзины покупок.
Это нулевая конфигурация
Возможно, главное преимущество SQLite заключается в том, что вам не нужно тратить десятки часов на настройку распределенной системы, чтобы хотя бы начать ее использовать. На самом деле вам ничего не нужно, даже жесткий диск, чтобы начать прототипирование. В вашей среде нет постоянного хранилища? Нет проблем: SQLite с радостью запустит для вас базу данных в памяти. Это означает превосходный опыт разработчиков. Основное внимание в libSQL уделяется возможности быстрого запуска и создания прототипа вашего проекта на 100 % локально, а также переноса его в облако только при развертывании в рабочей среде.
Это надежно
SQLite поддерживается обширным набором тестов, заявляющих о 100% охвате веток, в различных аспектах и конфигурациях:
- Проверка правильности
- Тесты ошибок ввода/вывода
- Фаззинг
- Регрессионные тесты
- Краш-тесты/тесты на потерю мощности
- Ограниченные тесты памяти
… и более.
Изрядная часть этого набора тестов, к сожалению, имеет закрытый исходный код (мы работаем над этим). Тем не менее, программное обеспечение повсеместно считается проверенным в боевых условиях, поскольку оно поддерживает все, от смартфонов до самолетов и многого другого. Важно иметь возможность доверять базе данных свои данные — избегайте повреждения, потери данных, битовой гнили и всех других неприятных вещей, которые могут произойти. И хотя невозможно избежать всех таких ситуаций невредимыми, надлежащее тестовое покрытие — лучшая превентивная мера для начала.
Это многофункциональный
Пусть его компактный размер не вводит вас в заблуждение — SQLite нагружен функциями. Знаете ли вы, что вы можете запросить сегодняшнюю дату с помощью простого запроса?
SELECT date('now');
Ладно, не особо впечатляет. Как насчет первого числа текущего месяца?
SELECT date('now', 'start of month');
Все еще не впечатлен? Давайте вместо этого получим первую неделю месяца:
SELECT date('now', 'start of month', '+7 days');
О, ты хотел первый четверг? SQLite поможет вам:
SELECT date('now', 'start of month', '+7 days', 'weekday 3');
УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ? Ну вот:
SELECT date('now', 'start of month', '+7 days', 'weekday 3', 'utc');
И мы едва рассмотрели здесь функции даты/времени.
Также стоит отметить механизм расширения. Хотя база SQLite относительно мала и надежна, ее можно легко расширить за счет бесконечных функций. Расширения с открытым исходным кодом (например, sqlean) варьируются от дополнительных математических функций до сложных структур данных, поддержки различных форматов хранения, интеграции с искусственным интеллектом, таких как встраивание или векторный поиск, репликация, CRDT и множество других функций.
libSQL также расширяет ванильный интерфейс SQLite определяемыми пользователем функциями WebAssembly, что дает пользователям еще большую гибкость.
Это может быть Васм!!
SQLite, как и libSQL, можно скомпилировать в краткий модуль Wasm — всего 390 КБ в сжатом виде, менее 900 КБ в несжатом виде. Он может запускать полноценный механизм SQL в памяти, но это еще не все! Он также способен сохранять данные в локальном хранилище вашего браузера или OPFS — Origin Private File System — это современный подход к предоставлению частной файловой системы для веб-приложений. Вы можете попробовать демо, чтобы понять, как это работает. .
Но WebAssembly выходит далеко за рамки браузеров, как и SQLite. Последние версии компилируются в WASI — модульный системный интерфейс для WebAssembly. Это открывает совершенно новый мир возможностей, делая SQLite пригодным для периферийных сред, которые запускают бессерверные функции в виде модулей Wasm — Fermyon Spin, Cloudflare Workers, scale.sh.
Что дальше?
SQLite имеет большой потенциал для периферии. Наш форк — libSQL — является одновременно открытым исходным кодом и открытым вкладом, и мы стремимся развивать его, чтобы он подходил для гораздо большего количества вариантов использования, чем изначально был разработан SQLite, включая периферийные среды, такие как Turso, наша периферийная база данных. Мы представляем собой сообщество, так что чувствуйте себя ободренными, чтобы стать вкладчиком. О, и отметьте нас на GitHub!