Наскільки масштабованим є SQLite? [зачинено]


178

Нещодавно я прочитав це запитання про SQLite vs MySQL, і у відповіді було вказано, що SQLite не так масштабується, але офіційний веб - сайт наче це підтверджує .

Наскільки масштабований SQLite і які його верхні межі?

Відповіді:


429

Вчора я випустив невеликий сайт *відстежувати представника, який використовував спільну базу даних SQLite для всіх відвідувачів. На жаль, навіть при скромному навантаженні, яке він поклав на мого господаря, він біг досить повільно. Це тому, що вся база даних була заблокована кожного разу, коли хтось переглядав сторінку, оскільки вона містила оновлення / вставки. Я незабаром перейшов на MySQL, і, хоча у мене не було багато часу, щоб перевірити його, це здається набагато масштабнішим, ніж SQLite. Я просто пам’ятаю повільне завантаження сторінок і час від часу отримую помилку з блокованою базою даних при спробі виконання запитів з оболонки в sqlite. Але це означає, що я запускаю ще один сайт із SQLite. Різниця полягає в тому, що сайт є статичним (тобто я єдиний, хто може змінити базу даних), і тому він працює чудово для одночасного читання. Мораль історії:

редагувати : Я щойно зрозумів, що я, можливо, не був справедливим до SQLite - я не індексував жодних стовпців у базі даних SQLite, коли я обслуговував його з веб-сторінки. Це частково спричинило уповільнення, яке я відчував. Однак спостереження за блокуваннями баз даних - якщо у вас особливо обтяжливі оновлення, продуктивність SQLite не буде відповідати MySQL або Postgres.

ще одна редакція: Оскільки я опублікував це майже 3 місяці тому, у мене була можливість уважно вивчити масштабованість SQLite, і за допомогою декількох хитрощів це може бути досить масштабованим. Як я вже згадував у своєму першому редагуванні, індекси баз даних різко скорочують час запитів, але це більше загальне спостереження щодо баз даних, ніж про SQLite. Однак є ще одна хитрість, яку ви можете використовувати для прискорення SQLite: транзакції . Щоразу, коли вам доведеться робити кілька записів у базу даних, вкладайте їх всередину транзакції. Замість того, щоб писати у файл (і блокувати) його щоразу, коли запит на запис видається, запис буде відбуватися лише один раз, коли транзакція завершиться.

Сайт, про який я згадував, який я випустив у першому абзаці, був повернений до SQLite, і він працює досить плавно, коли я налаштував свій код у кількох місцях.

* сайт більше не доступний


3
"Класичний" двигун бази даних MySQL, MyISAM, має ті ж проблеми, що стосуються одночасних операцій читання / запису, як і SQLite. Фактично, він блокує кожен окремий рядок, який він торкається в процесі запису, що робить неможливим масштабування додатків, що вимагають великого запису. Тим не менш, він обслуговував багато веб-додатків просто чудово.
Геннінг

1
Чи можете ви потім переписати початок своєї відповіді? Судити про ефективність БД без відповідних індексів абсолютно несправедливо. Також транзакції сильно змінюють продуктивність та масштабованість SQLite.
Корнель

3
@porneL: Правда, але SQLite без індексів був на порядок повільніше, ніж MySQL без індексів, і я також включив трохи про транзакції у своєму другому редагуванні. Я все ще думаю, що прогресування відповіді має певний сенс - це показує моє первісне наївне використання SQLite та наскільки відносно поганою була його ефективність. Я сподіваюся, що у нових користувачів на платформі виникнуть подібні проблеми, і я сподіваюся, що вони зможуть ідентифікувати перший абзац, потім прочитати наступні зміни та зрозуміти, що існують способи пришвидшити роботу SQLite, щоб досягти прийнятної продуктивності.
Кайл Кронін

1
Чи можете ви поділитися з нами приблизно, скільки звернень за секунду отримує ваш сайт?
NoobOverflow

2
Також в нових версіях SQLite доступні журнали попереднього запису (WAL), які можуть позбавити від болю циклів читання / запису. Все змінюється.
Лассе В. Карлсен

58

Sqlite є масштабованим в плані однокористувацького, у мене багатогігабайтна база даних, яка працює дуже добре, і у мене не було з цим багато проблем.

Але це однокористувальницький, так що це залежить від того , які розширення ви говорите.

У відповідь на коментарі. Зауважте, що ніщо не заважає використовувати базу даних Sqlite в середовищі для багатьох користувачів, але кожна транзакція (фактично, кожен оператор SQL, що модифікує базу даних) робить блокування файлу , що не дозволить іншим користувачам отримати доступ до бази даних на всі .

Отже, якщо в базі даних зроблено багато змін, ви, по суті, дуже швидко зіткнетеся з проблемами масштабування. Якщо, з іншого боку, у вас багато доступу до читання порівняно з доступом до запису, це може бути не так вже й погано.

Але Sqlite буде, звичайно ж функції в середовищі багато користувачів, але він не буде виконувати добре.


5
SQLite 3 підтримує читання, коли інші користувачі пишуть на нього.
Алікс Аксель

2
Зауважте, що вищезазначені коментарі застаріли, з новою системою (er) WAL, запис і читання можуть виконуватися одночасно, збільшуючи масштабованість.
Лассе В. Карлсен

Чи можливо створити для експорту записів на льоту до sqlite з будь-яких rdbms, таких як sql-сервер чи oracle тощо?
ILoveStackoverflow

29

SQLite управляє веб-сайтом sqlite.org та іншими, що мають багато трафіку. Вони припускають, що якщо у вас менше 100 тис. Звернень на день, SQLite повинен працювати добре. І це було написано ще до того, як вони поставили функцію "Writeahead Logging".

Якщо ви хочете прискорити роботу з SQLite, виконайте наступне:

  • оновлення до SQLite 3.7.x
  • Увімкнути ведення журналу попереднього запису
  • Запустіть таку прагму: "PRAGMA cache_size = Кількість сторінок;" Розмір за замовчуванням (Кількість сторінок) - 2000 сторінок, але якщо ви збільшите це число, то ви збільшите кількість даних, що вичерпається прямо з пам'яті.

Ви можете подивитися на моє відео на YouTube під назвою " Поліпшення продуктивності SQLite за допомогою журналу Writeahead ", де показано, як використовувати журнал запису вперед та продемонструє 5- кратне покращення швидкості запису.


24

Sqlite - це база даних на робочому столі або в процесі роботи . SQL Server, MySQL, Oracle та їх брати - це сервери .

Настільні бази даних за своєю природою не є хорошим вибором для будь-якої програми, якій потрібно підтримувати паралельний доступ запису до сховища даних. Це включає на деякому рівні більшість створених веб-сайтів. Якщо вам навіть доведеться щось увійти, вам, мабуть, потрібен доступ для запису до БД.


5
Я не погоджуюсь із "Сюди входить майже кожен створений веб-сайт". коментар. Якщо веб-сайт із великим навантаженням, ви правильно. Наприклад, Trac використовує SQLite за замовчуванням і дуже добре працює у невеликих командах.
Ендрю Бернс

2
Надайте час: у вас буде одночасно два доступні розробники до того ж поля, і воно задихнеться.
Joel Coehoorn

3
Що ви визначаєте як дросель? з вашої відповіді я здогадуюсь, що у вас немає великого досвіду роботи з SQLite. SQLite заблокує весь файл під час операцій, тому у вас може виникнути затримка, але майже неможливо, щоб він задихнувся у запропонованій вами ситуації.
Ендрю Бернс

3
Ендрю, оскільки SQL Lite добре працює для невеликих команд, це не робить його масштабованим, а масштабування вимоги добре масштабувати, тобто він повинен добре працювати з великими командами. Наскільки мені відомо, SQL Lite не піддається масштабності для великих команд / одночасних операцій з базою даних, які перевищують досить низький поріг.
Поп Каталін

5
@Justice. Ця відповідь не підтверджує, наскільки масштабований SQLite. Відповідь ніхто не набагато краща.
GateKiller

23

Чи читали ви ці документи SQLite - http://www.sqlite.org/whentouse.html ?

SQLite зазвичай чудово працюватиме як двигун баз даних для веб-сайтів із низьким та середнім рівнем трафіку (тобто 99,9% усіх веб-сайтів). Обсяг веб-трафіку, з яким може працювати SQLite, залежить, звичайно, від того, наскільки сильно веб-сайт використовує свою базу даних. Взагалі кажучи, будь-який веб-сайт, що отримує менше 100 Кт / день, повинен добре працювати з SQLite. Показник 100 К / день - це консервативна оцінка, а не тверда верхня межа. Продемонстровано, що SQLite працює з 10-кратною кількістю трафіку.


3
Я дуже згоден з цим. 99% веб-сайтів могли б добре оброблятись за допомогою SQLLite, якщо ви цього хочете. Але 99% веб-трафіку припадає на найбільший 1% веб-сайтів, з іншого боку.
djangofan

7
Показник "100k хітів / день" - абсолютно сміття. "Показ", як правило, визначається як HTTP GET, і веб-сайт із купою нарізаних зображень може отримати 40+ "звернень" за перегляд сторінки - жодне з них не торкається БД. Навіть якщо документи роблять помилку попадання == перегляду сторінки, це все одно вводить в оману. SQLite блокує всю БД під час запису. Незважаючи на те, що він може достойно обслуговувати 100 тисяч переглядів сторінок людей, які лише переглядають записи, він розпадається в інтенсивному для запису додатку (електронна комерція, дошка оголошень тощо).
jamieb

10

Масштабованість SQLite буде сильно залежати від використовуваних даних та їх формату. У мене був складний досвід із надзвичайно довгими таблицями (GPS-записи, один запис в секунду). Досвід показав, що SQLite сповільнюватиметься поетапно, частково через постійне відновлення зростаючих бінарних дерев, що містять індекси (а з індексами, що знаходяться у часі, ви просто знаєте, що дерево буде набагато відновлюватися, але це життєво важливо для вашого пошуки). Отже, зрештою, приблизно в 1 Гб (я дуже відомий) запити стають млявими в моєму випадку. Ваш пробіг буде відрізнятися.

Потрібно пам’ятати, незважаючи на все хвастощі, SQLite НЕ створений для зберігання даних. Існують різні способи використання, які не рекомендуються для SQLite. Чудові люди за SQLite говорять самі:

Ще один спосіб поглянути на SQLite такий: SQLite не призначений для заміни Oracle. Він призначений для заміни fopen ().

І це призводить до головного аргументу (не кількісного, вибачте, але якісного), SQLite не для всіх застосувань, тоді як MySQL може охоплювати багато різноманітних застосувань, навіть якщо не в ідеалі. Наприклад, ви можете мати файли cookie Firefox MySQL для зберігання (замість SQLite), але вам потрібна ця послуга, яка працює весь час. З іншого боку, у вас може бути веб-сайт для транзакцій, який працює на SQLite (як багато людей) замість MySQL, але очікуєте багато простоїв.


1
Ви можете подолати проблему наявності дуже великих індексованих таблиць шляхом додавання даних, наприклад, однієї таблиці на день / тиждень. SQLite навіть дозволяє розділити таблиці на окремі файли баз даних, а потім використовувати ATTACH DATABASEдля створення віртуального з'єднання бази даних з усіма таблицями (однак важко обмежено 62 базами даних).
Алікс Аксель

3

я думаю, що (у номерах 1) веб-сервер, який обслуговує пошук клієнтів, з’являється в бекенде з одним підключенням до бази даних, чи не так?

Отже, в базі даних немає одночасного доступу, тому можна сказати, що база даних працює в режимі "єдиний користувач". Немає сенсу обговорювати багатокористувацький доступ за таких обставин, тому SQLite працює так само, як і будь-яка інша база даних на базі сервера.


1
Thx GateKiller, але вкажіть "веб-сайт із низьким обсягом".
Лід

3

Думай про це так. SQL Lite буде заблокований кожного разу, коли хтось використовує його (SQLite не блокується при читанні). Тож якщо ви розміщуєте веб-сторінку або програму, яка має декількох одночасних користувачів, одночасно ваш користувач може використовувати ваш додаток із SQLLite. Тож правильно виникає проблема масштабування. Якщо це додаток на одну особу, скажімо, Музична бібліотека, де ви зберігаєте сотні назв, рейтингів, інформації, використання, відтворення, час відтворення, то SQL Lite може масштабувати чудово, маючи тисячі записів, якщо не мільйони записів

MySQL, з іншого боку, добре працює для серверних додатків, де люди з усього світу будуть використовувати його одночасно. Він не замикається і має досить великі розміри. Отже, для вашої музичної бібліотеки MySql було б надто вбитим, оскільки бачила б її лише одна людина, ПІДНЯТЬ це спільна музична бібліотека, де тисячі додають або оновлюють її. Тоді MYSQL буде тим, хто буде використовувати.

Тож теоретично, масштаби MySQL краще, ніж Sqllite, тому що він може працювати з неохайними користувачами, але є надмірним для одного користувацького додатка.


5
s / використовує його / пише до нього. sqlite не блокується при прочитанні.
Грегг Лінд

5
ну Ваша відповідь може бути легко витлумачена. SQLite блокує лише запити на запис . Ми використовуємо SQLite для більш ніж 50 ГБ медичних даних у реляційній формі та обслуговуємо сотні одночасних веб-клієнтів для перегляду та запитів. Продуктивність її читання ніколи не гірша, ніж нещодавній MySQL.
Берк Д. Демір

3
MyISQL MyISAM не набагато кращий для одночасного доступу, ніж SQLite. MySQL багато використовує блокування на рівні таблиці, і не буде робити одночасне записування, за винятком кількох випадків, коли компонування MyISAM є оптимальним. Якщо ви не звертаєтесь до InnoDB (який має свої проблеми, такі як ніколи не скорочується файл даних), можливо, вам не буде набагато краще з MySQL.
Корнель

1

Веб-сайт SQLite (частина, на яку ви посилаєтесь) вказує, що його можна використовувати в різних ситуаціях для багатьох користувачів.

Я б сказав, що це може впоратися зовсім небагато. На мій досвід, це завжди було дуже швидко. Звичайно, вам потрібно проіндексувати свої таблиці, і при кодуванні проти них потрібно переконатися, що ви використовуєте парамеризовані запити тощо. В основному те саме, що ви зробили з будь-якою базою даних для підвищення продуктивності.


і використовувати транзакції. Це важливо для SQLite.
Корнель

-1

Можливо, варто перевірити REAL SQL Server - сервер баз даних, побудований на SQLite.


7
Я не думаю, що будь-який сайт вимагає витратити 299 доларів на "РЕАЛЬНИЙ сервер SQL", коли більшість сайтів не отримують достатньо трафіку, щоб навіть почати досягати меж SQLLite.
djangofan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.