SQLite в качестве производственной базы данных для сайта с низким трафиком?

Я рассматриваю возможность использования SQLite в качестве производственной базы данных для сайта, который будет принимать, возможно, 20 одновременных пользователей, но с потенциалом пика, который может быть во много раз больше (поскольку сайт будет доступен в открытом Интернете, и всегда есть вероятность того, что кто-то разместит где-нибудь ссылку, которая может привести сразу много людей на сайт).

Возможен ли SQLite?

Я знаю, что это не идеальный производственный сценарий. Я только спрашиваю, реально ли это.


person carson welsh    schedule 26.05.2009    source источник
comment
Когда вы достигаете предела SQLite, ваш веб-сайт достаточно успешен, чтобы вы могли без проблем перейти на MySQL;)   -  person Fabio Ricci    schedule 27.02.2021


Ответы (10)


SQLite не поддерживает какой-либо параллелизм, поэтому у вас могут возникнуть проблемы с его запуском на рабочем веб-сайте. Если вы ищете «более легкую» базу данных, попробуйте современное хранилище объектных документов, такое как CouchDB.

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

Автор SQLite обращается к этому на веб-сайте:

SQLite отлично работает в качестве механизма базы данных для большинства веб-сайтов с низким и средним трафиком (то есть для большинства веб-сайтов). Объем веб-трафика, который может обрабатывать SQLite, зависит от того, насколько интенсивно веб-сайт использует свою базу данных. Вообще говоря, любой сайт с посещаемостью менее 100 000 в день должен нормально работать с SQLite. Цифра в 100 000 посещений в день — это консервативная оценка, а не жесткая верхняя граница. Было продемонстрировано, что SQLite работает с в 10 раз большим объемом трафика.

Веб-сайт SQLite (https://www.sqlite.org/), разумеется, использует сам SQLite, и в качестве На момент написания этой статьи (2015 г.) он обрабатывает от 400 до 500 тысяч HTTP-запросов в день, около 15-20% из которых являются динамическими страницами, касающимися базы данных. Динамический контент использует около 200 операторов SQL на веб-страницу. Эта установка работает на одной виртуальной машине, которая совместно использует физический сервер с 23 другими, но большую часть времени удерживает среднюю нагрузку ниже 0,1.

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


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


Изменить (2014 г.):

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

Чарльз Лейфер написал сообщение в блоге о возможностях SQLite. Функция WAL (упреждающая запись) и некоторые взвешенные мнения о соответствующих вариантах использования.

person Bayard Randel    schedule 26.05.2009
comment
Проблемы со скоростью? Но с таким небольшим количеством пользователей я не знаю, действительно ли это проблема, даже если это не допускает параллелизма. (Меня интересуют только реляционные базы данных) - person carson welsh; 27.05.2009
comment
Интересная цитата. Жаль, что это не из более независимого источника, чем сам автор Sqlite. Я бы предпочел увидеть какую-нибудь внешнюю проверку. - person carson welsh; 27.05.2009
comment
Я думаю, что он довольно откровенен — он признает, что Интернет — не идеальное приложение для SQLlite. - person Bayard Randel; 27.05.2009
comment
Эта ветка слайд-хостинга была хорошей дискуссией, особенно это: подумайте, например, о блоге. Поскольку несколько пользователей могут комментировать один пост, множественные одновременные записи не так уж надуманы. Однако, если в вашем блоге нет возможности комментировать, существует небольшая вероятность того, что две записи будут сделаны одновременно (если только у вас нет достаточного количества авторов). Итак, подумайте о возможных вариантах использования. Если действительно существует вероятность того, что два или более пользователей будут одновременно писать в базу данных, я бы избегал SQLite. Подробнее о блокировке и параллелизме: sqlite.org/lockingv3.html - person carson welsh; 27.05.2009
comment
Я думаю, что ваш пост поднимает интересный вопрос: на самом деле ничто не заполняет этот пробел между хранилищами отдельных файлов, такими как berkelydb/sqllite, и более корпоративными решениями, такими как mysql и postgres. MySQL, безусловно, раньше был довольно компактным, но с годами в него были введены функции, общие для корпоративных БД. - person Bayard Randel; 27.05.2009
comment
Это проницательное наблюдение. Об этом тоже не думал. - person carson welsh; 27.05.2009
comment
Я предполагаю, что это изменилось с момента публикации вашего комментария, но очень важно отметить sqlite.org/threadsafe.html. что противоречит вашему первому утверждению, SQLite не поддерживает какой-либо параллелизм. - person lmat - Reinstate Monica; 01.02.2014
comment
Пока приложение только вставляет и никогда не обновляет, все в порядке и для производства, избегая конфликтов, использования параллелизма. Не так ли? Тогда фактическое приложение может позаботиться о любых конфликтах, например, в коде PHP. Кроме того, поскольку БД может стать довольно большой, если только обновить некоторые вещи, адресация которых тоже хороша. - person K. Kilian Lindberg; 07.04.2014
comment
Это заведомо неверно — SQLite поддерживает параллелизм. - person coleifer; 14.07.2014
comment
Спасибо, но на момент публикации SQLite не был многопоточным. Я предоставил ссылку на sqlite.org/threadsafe.html и изменил сообщение. - person Bayard Randel; 15.07.2014
comment
Комментарий от 2017 года: основное письмо ВСЕ ЕЩЕ требует отказа от sqlite (или какой-то очереди, в этой ситуации переход на клиент/сервер, вероятно, будет менее трудоемким). Сейчас я столкнулся с этой проблемой с моим плохо написанным веб-приложением, вероятно, из-за слишком большого количества записей одновременно. - person Ng Oon-Ee; 15.07.2017
comment
Спасибо за обновление, чтобы включить функцию WAL. Ваш пост является хорошей отправной точкой для рассмотрения SQLite для небольших распределенных приложений. - person Wolf; 19.01.2018

Небольшой отрывок с веб-сайта SQLite говорит сам за себя.

  • Разделены ли данные от приложения сетью? → выберите клиент/сервер

  • Много одновременных авторов? → выберите клиент/сервер

  • Большие данные? → выбрать клиент/сервер

  • В противном случае → выберите SQLite!

SQLite «просто работает» (пока, конечно, не работает)

person nehem    schedule 12.05.2015
comment
SQLite просто работает. -- Это может быть хорошей отправной точкой. Разве не интереснее подумать о том, что произойдет, если SQLite перестанет работать, например, если трафик вырастет. Не будет ли потом легко изменить СУБД? - person Wolf; 19.01.2018
comment
Если кто-то использует веб-фреймворки, не зависящие от базы данных (с использованием ORM), такие как, например, Django (для Python), то я думаю, что это не будет большой проблемой. Что вы думаете? Сейчас я разрабатываю и поддерживаю такой сервис с помощью SQLite и планирую перейти на PostgreSQL, если нагрузка будет расти. - person konstunn; 24.07.2019

Мы часто используем SQLite для внутренних баз данных; Каталог сотрудников, наш календарь событий и другие службы интрасети работают на облегченных базах данных. Было бы излишним запускать эти приложения в масштабе, который мы делаем в «настоящей» базе данных, такой как mySQL. Это особенно верно, если учесть, что они работают вместе с 4 другими виртуальными машинами на одном компьютере среднего уровня.

В какой-то момент у нас был внешний сайт, который месяцами работал на sqlite db, требуя только одной перезагрузки. Очевидно, что это был очень низкий трафик, но он прекрасно справился со своей задачей.

person Soviut    schedule 26.05.2009
comment
Это здорово знать. Спасибо. Я начинаю привыкать к этой идее после прочтения множества положительных отзывов, подобных этому. - person carson welsh; 27.05.2009
comment
@carsonwelsh Я только надеюсь, что вы также рассмотрели противоречивые отзывы;) - person Wolf; 19.01.2018

Мы столкнулись с подобным вариантом в среде с полным отсутствием операций записи и выбрали использование SQLite.

См. мой сообщение в блоге на эту тему:

Что ж, основное предположение, которое делает это решение теоретически возможным, заключается в том, что наша база данных SQLite полностью доступна только для чтения. Наш серверный код никогда не должен его менять. Это решит любые проблемы с блокировкой, так как нет блокировки чтения. Мы нигде не смогли найти в Интернете, чтобы кто-нибудь говорил, что есть проблема с высокопроизводительным чтением SQLite, когда нет записи - это может быть возможно!

person Uri Agassi    schedule 20.10.2014
comment
Интересный вариант использования. Ваш пост в блоге датирован 11 октября 2014 года. Можете ли вы сказать, что он актуален или что-то важное сегодня отсутствует? - person Wolf; 19.01.2018
comment
@Wolf - я не знаю, актуален ли он (например, я не знаком с WAL), но, поскольку предположения все еще в силе, я думаю, что вывод остается прежним. - person Uri Agassi; 19.01.2018
comment
Режим Wal избегает писателей, чтобы блокировать считывателей, реальная проблема для sqlite - это количество писателей за раз, которые будут поставлены в очередь, чтобы подождать некоторое время, прежде чем появится ошибка занятости. - person Molem; 14.06.2020

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

person Adam Says - Reinstate Monica    schedule 26.05.2009
comment
Вы имеете в виду, что если будет попытка выполнить две одновременные записи, она будет заблокирована до тех пор, пока одна не завершится, а затем пропустит другую? Это не похоже на проблему целостности данных, а скорее на скорость. Учитывая низкий объем трафика, это может быть терпимо. - person carson welsh; 27.05.2009
comment
Он не будет блокироваться, но вернет SQLITE_BUSY. Приложение должно решить, как действовать дальше, например. подождите некоторое время и повторите попытку или сдайтесь и верните ошибку. - person laalto; 27.05.2009
comment
Также с режимом wal (упреждающая запись) sqlite стал более производительным, если кому-то еще интересно. - person infocyde; 11.11.2017
comment
@infocyde Да, определенно все еще заинтересован в этом :) - person Wolf; 19.01.2018
comment
Я написал дерьмовый веб-сайт с низким трафиком, где я почти единственный, кто обновляет информацию, и он отлично работает. Это на самом деле чертовски быстро для чтения. Я бы спроектировал вещи, чтобы вы могли без особых усилий переключить серверную базу данных с sqlite на что-то другое, если и когда вы столкнетесь со стеной производительности с несколькими операциями записи. Опять же, с режимом стены вам не нужно быть таким параноиком, как многие думают. Я планирую создать множество веб-приложений с помощью sqlite, и те, которые наберут обороты, будут переведены на sqlserver или другую базу данных в будущем. - person infocyde; 31.01.2018

Люди говорят о проблемах параллелизма, но у sqlite есть способ кэшировать входящие запросы и заставлять их ждать некоторое время. Это не тайм-аут немедленно.

Я читал что-то о настройке тайм-аута по умолчанию, которая начинается с нуля, что означает, что время ожидания истекает немедленно, и это чепуха. Может люди не настроили эту настройку?

person Community    schedule 03.07.2010
comment
Подумайте о параллелизме и распределенных серверах, например, с балансировщиками нагрузки и несколькими базами данных. Здесь sqlite не работает. Сам по себе он очень хорош как автономное решение. Я использую это :) - person radtek; 18.01.2014
comment
Может быть несколько устаревшим, так как был введен WAL - person Wolf; 19.01.2018

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

person Badaro    schedule 26.05.2009
comment
Это большое «если». Что, если это неправда? - person carson welsh; 27.05.2009
comment
Если это не так, то с потенциальным пиком, который может быть многократным пунктом в вашем вопросе, ситуация станет рискованной. У нас обоих есть сомнения, справится ли SQLLite с этой задачей, поэтому я в первую очередь предложил кэширование: чтобы не слишком зависеть от его производительности, если вы получите большое увеличение числа обращений. - person Badaro; 27.05.2009
comment
Я понимаю. Но я не в восторге от идеи приблизить функциональность базы данных в моем приложении. Я лучше оставлю эту работу базе данных. - person carson welsh; 27.05.2009
comment
Вам не нужно заходить так далеко. Я говорил больше о кэшировании обработанных данных, необходимых вашим представлениям для рендеринга, или даже вывода HTML, если это возможно. - person Badaro; 27.05.2009

Я использую его на веб-сервере с очень низким трафиком (это геномная база данных), и у меня нет никаких проблем. Но есть только операторы SELECT, запись в БД не требуется.

person BlogueroConnor    schedule 13.07.2009

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

person radtek    schedule 18.01.2014

Похоже, что с очередями вы также можете избежать многих проблем с параллельной записью в SQLite. Вместо того, чтобы писать непосредственно в sqlite db, вы должны писать в очередь, которая затем, в свою очередь, последовательно записывает в sqlite db в режиме «первый пришел — первый вышел». Не уверен, что ваше приложение достигает того места, где вам это нужно, если его стоит написать или просто перейти к клиент-серверной БД... но мысль.

person infocyde    schedule 11.06.2015
comment
Если мы говорим о веб-приложении asp.net, статический метод может быть создан с ключевым словом блокировки для координации каждого запроса (потока) для фиксации транзакции один за другим; это могло бы избежать ошибки занятости sqlite, но каждый коммит будет ждать больше миллисекунд, так как больше пользователей хотят записывать в БД за раз - person Molem; 14.06.2020