Jak skalowalny jest SQLite? [Zamknięte]

178

Niedawno przeczytałem to pytanie o SQLite vs. MySQL, a odpowiedź wskazała, że ​​SQLite nie skaluje się dobrze i oficjalna strona internetowa potwierdza to .

Jak skalowalny jest SQLite i jakie są jego najwyższe limity?

GateKiller
źródło

Odpowiedzi:

429

Wczoraj wypuściłem małą stronę *do śledzenia twojego przedstawiciela, który korzystał ze wspólnej bazy danych SQLite dla wszystkich odwiedzających. Niestety, nawet przy niewielkim obciążeniu mojego hosta działało dość wolno. Wynika to z faktu, że cała baza danych była blokowana za każdym razem, gdy ktoś przeglądał stronę, ponieważ zawierała ona aktualizacje / wstawki. Wkrótce przeszedłem na MySQL i chociaż nie miałem zbyt wiele czasu na przetestowanie go, wydaje się, że jest znacznie bardziej skalowalny niż SQLite. Pamiętam tylko powolne ładowanie strony i czasami błąd blokady bazy danych podczas próby wykonania zapytań z powłoki w sqlite. To powiedziawszy, dobrze uruchamiam inną witrynę z SQLite. Różnica polega na tym, że strona jest statyczna (tzn. Jestem jedyną, która może zmienić bazę danych), więc działa dobrze dla równoczesnych odczytów. Morał historii:

edycja : Właśnie zdałem sobie sprawę, że mogłem nie być uczciwy wobec SQLite - nie indeksowałem żadnych kolumn w bazie danych SQLite, kiedy serwowałem je ze strony internetowej. To częściowo spowodowało spowolnienie, którego doświadczałem. Jednak obserwacja podstaw blokowania bazy danych - jeśli masz szczególnie uciążliwe aktualizacje, wydajność SQLite nie będzie pasować do MySQL lub Postgres.

kolejna edycja: odkąd opublikowałem to prawie 3 miesiące temu, miałem okazję dokładnie zbadać skalowalność SQLite, a przy kilku sztuczkach może być całkiem skalowalny. Jak wspomniałem w mojej pierwszej edycji, indeksy baz danych znacznie skracają czas zapytań, ale jest to bardziej ogólne spostrzeżenie dotyczące baz danych niż SQLite. Istnieje jednak inna sztuczka, której można użyć do przyspieszenia transakcji SQLite: transakcje . Ilekroć musisz wykonać wiele zapisów w bazie danych, umieść je w transakcji. Zamiast zapisywać do pliku (i blokować) za każdym razem, gdy wysyłane jest zapytanie o zapis, zapis nastąpi tylko raz po zakończeniu transakcji.

Witryna, o której wspomniałem, którą opublikowałem w pierwszym akapicie, została z powrotem przełączona na SQLite i działa dość płynnie po dostrojeniu kodu w kilku miejscach.

* strona nie jest już dostępna

Kyle Cronin
źródło
3
„Klasyczny” silnik bazy danych MySQL, MyISAM, ma takie same problemy dotyczące współbieżnych operacji odczytu / zapisu jak SQLite. W rzeczywistości blokuje każdy dotknięty wiersz podczas operacji zapisu, co uniemożliwia skalowanie aplikacji intensywnie zapisujących. Mimo to dobrze obsługiwał wiele aplikacji internetowych.
Henning
1
Czy mógłbyś wtedy przepisać początek swojej odpowiedzi? Ocena wydajności DB bez odpowiednich indeksów jest całkowicie niesprawiedliwa. Również transakcje bardzo zmieniają wydajność i skalowalność SQLite.
Kornel,
3
@porneL: To prawda, ale SQLite bez indeksów był o rząd wielkości wolniejszy niż MySQL bez indeksów, a także uwzględniłem trochę transakcji w mojej drugiej edycji. Nadal uważam, że postęp odpowiedzi ma sens - pokazuje moje początkowe naiwne użycie SQLite i relatywnie niską wydajność. Oczekuję, że nowi użytkownicy platformy napotkają podobne problemy i mam nadzieję, że będą w stanie zidentyfikować się z akapitem pierwszym, a następnie przeczytają poniższe zmiany i zdadzą sobie sprawę, że istnieją sposoby na przyspieszenie SQLite, aby uzyskać akceptowalną wydajność.
Kyle Cronin
1
Czy możesz podać nam przybliżoną liczbę wyświetleń witryny na sekundę?
NoobOverflow
2
Dostępne są również funkcje zapisu z wyprzedzeniem zapisu (WAL) w nowszych wersjach SQLite, które mogą odciążyć część cykli odczytu / zapisu. Rzeczy się zmieniają.
Lasse V. Karlsen
58

Sqlite jest skalowalny pod względem pojedynczego użytkownika, mam wielogigabajtową bazę danych, która działa bardzo dobrze i nie miałem z nią większych problemów.

Ale jest to jeden użytkownik, więc zależy to od rodzaju skalowania, o którym mówisz.

W odpowiedzi na komentarze. Zauważ, że nic nie stoi na przeszkodzie, aby używać bazy danych Sqlite w środowisku wielu użytkowników, ale każda transakcja (w efekcie każda instrukcja SQL modyfikująca bazę danych) blokuje plik , co uniemożliwi innym użytkownikom dostęp do bazy danych w wszystko .

Więc jeśli wykonałeś wiele modyfikacji bazy danych, zasadniczo bardzo szybko trafisz na problemy ze skalowaniem. Z drugiej strony, jeśli masz dużo dostępu do odczytu w porównaniu do dostępu do zapisu, może nie być tak źle.

Ale Sqlite będzie oczywiście działał w środowisku wielu użytkowników, ale nie będzie działał dobrze.

Lasse V. Karlsen
źródło
5
SQLite 3 obsługuje czytanie, gdy inni użytkownicy do niego piszą.
Alix Axel
2
Należy zauważyć, że powyższe komentarze są nieaktualne, ponieważ w nowym (er) systemie WAL zapisy i odczyty można wykonywać jednocześnie, co zwiększa skalowalność.
Lasse V. Karlsen
Czy można tworzyć eksportowane rekordy w locie do sqlite z dowolnego rdbms, takiego jak serwer sql lub oracle itp?
ILoveStackoverflow
29

SQLite napędza witrynę sqlite.org i inne, które mają duży ruch. Sugerują, że jeśli masz mniej niż 100 000 działań dziennie, SQLite powinien działać dobrze. I to zostało napisane przed udostępnieniem funkcji „Writeahead Logging”.

Jeśli chcesz przyspieszyć działanie SQLite, wykonaj następujące czynności:

  • uaktualnij do SQLite 3.7.x
  • Włącz rejestrowanie z wyprzedzeniem
  • Uruchom następującą pragmę: „PRAGMA cache_size = liczba stron;” Domyślny rozmiar (liczba stron) to 2000 stron, ale jeśli zwiększysz tę liczbę, zwiększysz ilość danych, która kończy się w pamięci.

Możesz rzucić okiem na mój film na YouTube zatytułowany „ Popraw wydajność SQLite dzięki Writeahead Logging ”, który pokazuje, jak korzystać z rejestrowania z wyprzedzeniem zapisu i demonstruje 5- krotną poprawę prędkości zapisu.

Jay Godse
źródło
24

Sqlite to komputerowa lub przetwarzana baza danych. SQL Server, MySQL, Oracle i ich bracia to serwery .

Pulpitowe bazy danych z natury nie są dobrym wyborem dla żadnej aplikacji, która musi obsługiwać równoczesny dostęp do zapisu do magazynu danych. Obejmuje to na pewnym poziomie większość stron internetowych, jakie kiedykolwiek stworzono. Jeśli musisz się nawet zalogować, prawdopodobnie potrzebujesz dostępu do bazy danych.

Joel Coehoorn
źródło
5
Nie zgadzam się z „Dotyczy to prawie każdej strony internetowej, jaką kiedykolwiek stworzono”. komentarz. Jeśli witryna jest obciążona, masz rację. Na przykład Trac domyślnie korzysta z SQLite i działa bardzo dobrze po wyjęciu z pudełka dla małych zespołów.
Andrew Burns,
2
Daj mu czas: będziesz mieć dwóch programistów dostęp do tego samego pola w tym samym czasie i będzie się dusić.
Joel Coehoorn,
3
Co definiujesz jako duszenie? po twojej odpowiedzi zgaduję, że nie masz dużego doświadczenia z SQLite. SQLite zablokuje cały plik na operacjach, więc może wystąpić opóźnienie, ale jest prawie niemożliwe, aby „zadławić się” w proponowanej sytuacji.
Andrew Burns,
3
Andrew, ponieważ SQL Lite działa dobrze dla małych zespołów, nie czyni go skalowalnym, w celu skalowania wymaganie jest dobrze skalowalne, co oznacza, że ​​powinno działać dobrze w dużych zespołach. Według mojej wiedzy SQL Lite nie jest skalowalny do dużych zespołów / współbieżnych operacji na bazie danych, które przekraczają dość niski próg.
Pop Catalin,
5
@Sprawiedliwość. Ta odpowiedź nie ma dowodów na to, jak skalowalny jest SQLite. Odpowiedź nikogo nie jest lepsza.
GateKiller,
23

Czy czytałeś te dokumenty SQLite - http://www.sqlite.org/whentouse.html ?

SQLite zwykle działa świetnie jako silnik bazy danych dla witryn o niskim i średnim ruchu (czyli 99,9% wszystkich witryn). Ilość ruchu w sieci, którą SQLite może obsłużyć, zależy oczywiście od tego, jak intensywnie witryna wykorzystuje swoją bazę danych. Ogólnie rzecz biorąc, każda witryna, która otrzymuje mniej niż 100 000 działań dziennie, powinna dobrze działać z SQLite. Liczba 100 000 trafień / dzień jest ostrożnym szacunkiem, a nie twardą górną granicą. Wykazano, że SQLite działa z 10-krotnym natężeniem ruchu.

Sam
źródło
3
Zgadzam się BARDZO z tym. Jeśli chcesz, 99% stron internetowych można obsługiwać za pomocą SQLLite. Z drugiej strony 99% ruchu internetowego trafia do największego 1% stron internetowych.
djangofan
7
Metryka „100 000 odsłon / dzień” to kompletne śmieci. „Trafienie” jest zwykle definiowane jako HTTP GET, a strona internetowa z grupą pokrojonych obrazów może uzyskać ponad 40 „trafień” na odsłonę - żadna z nich nie dotyka DB. Nawet jeśli dokumenty popełniają błąd przy trafieniu == odsłona strony, nadal jest to mylące. SQLite blokuje cały DB podczas zapisu. Chociaż może dzielnie wyświetlać 100 tys. Odsłon osób przeglądających rekordy, rozpadnie się w aplikacji intensywnie zapisującej (e-commerce, tablica ogłoszeń itp.).
jamieb
10

Skalowalność SQLite będzie w dużej mierze zależeć od użytych danych i ich formatu. Miałem ciężkie doświadczenia z bardzo długimi stołami (rekordy GPS, jeden rekord na sekundę). Doświadczenie pokazało, że SQLite zwalnia stopniowo, częściowo z powodu ciągłego przywracania równowagi rosnącym drzewom binarnym posiadającym indeksy (a dzięki indeksom ze znacznikiem czasu po prostu wiesz, że drzewo będzie bardzo zrównoważone, ale jest to bardzo ważne dla twojego wyszukiwania). W końcu około 1 GB (bardzo ballpark, wiem), w moim przypadku zapytania stają się powolne. Twój przebieg będzie się różnić.

Należy pamiętać, że pomimo wszystkich przechwałek, SQLite NIE jest przeznaczone do hurtowni danych. Istnieją różne zastosowania niezalecane dla SQLite. Świetni ludzie stojący za SQLite mówią sami:

Innym sposobem spojrzenia na SQLite jest: SQLite nie jest przeznaczony do zastąpienia Oracle. Jest przeznaczony do zastąpienia fopen ().

Prowadzi to do głównego argumentu (nie ilościowego, przepraszającego, ale jakościowego), SQLite nie jest do wszystkich zastosowań, podczas gdy MySQL może obejmować wiele różnych zastosowań, nawet jeśli nie idealnie. Na przykład możesz mieć MySQL do przechowywania plików cookie Firefox (zamiast SQLite), ale potrzebujesz tej usługi przez cały czas. Z drugiej strony, możesz mieć transakcyjną stronę internetową działającą na SQLite (jak robi to wiele osób) zamiast na MySQL, ale spodziewaj się wielu przestojów.

MPelletier
źródło
1
Możesz poradzić sobie z problemem posiadania bardzo dużych indeksowanych tabel, dzieląc dane, np. Jedną tabelę na dzień / tydzień. SQLite pozwala nawet podzielić tabele na odrębne pliki bazy danych, a następnie użyć ATTACH DATABASEdo utworzenia wirtualnego połączenia bazy danych ze wszystkimi tabelami (jednak ograniczone do 62 baz danych).
Alix Axel
3

myślę, że na zapleczu pojawia się serwer (w liczbach 1) obsługujący setki klientów z pojedynczym połączeniem z bazą danych, prawda?

Nie ma więc równoczesnego dostępu do bazy danych, dlatego możemy powiedzieć, że baza danych działa w trybie „pojedynczego użytkownika”. Nie ma sensu dyskutować o dostępie dla wielu użytkowników w takich okolicznościach, dlatego SQLite działa tak samo, jak każda inna baza danych oparta na serwerze.

lód
źródło
1
Thx GateKiller, ale proszę podać „witrynę o niskim wolumenie”.
Ice
3

Pomyśl o tym w ten sposób. SQL Lite będzie blokowany za każdym razem, gdy ktoś go użyje (SQLite nie blokuje się podczas czytania). Jeśli więc serwujesz stronę internetową lub aplikację, która ma wielu współbieżnych użytkowników, tylko jedna może korzystać z Twojej aplikacji jednocześnie z SQLLite. Więc jest problem ze skalowaniem. Jeśli aplikacja jednoosobowa powie bibliotekę muzyczną, w której przechowywane są setki tytułów, ocen, informacji, użytkowania, odtwarzania, czasu odtwarzania, SQL Lite będzie się pięknie skalować, przechowując tysiące, jeśli nie miliony rekordów (jeśli jest to możliwe na dysku twardym)

Z drugiej strony MySQL działa dobrze w aplikacjach serwerowych, gdzie ludzie na całym świecie będą go używać jednocześnie. Nie blokuje się i ma dość duży rozmiar. Tak więc dla twojej biblioteki muzycznej MySql byłby zbyt zabójczy, jak zobaczyłaby go tylko jedna osoba, chyba że jest to wspólna biblioteka muzyczna, w której tysiące dodają lub aktualizują ją. Wtedy użyje MYSQL.

Więc teoretycznie MySQL skaluje się lepiej niż Sqllite, ponieważ może obsługiwać wielu użytkowników, ale jest przesadą w przypadku aplikacji dla jednego użytkownika.

wędrowny
źródło
5
s / używa go / zapisuje do niego. sqlite nie blokuje się podczas odczytu.
Gregg Lind,
5
twoja odpowiedź może być łatwo źle zinterpretowana. SQLite blokuje tylko żądania zapisu . Używamy SQLite dla ponad 50 GB danych medycznych w formie relacyjnej i obsługujemy setki jednoczesnych klientów internetowych do przeglądania i zapytań. Jego wydajność odczytu nigdy nie jest gorsza niż najnowszego MySQL.
Berk D. Demir
3
MyISAM MySQL nie jest dużo lepszy do równoczesnego dostępu niż SQLite. MySQL często korzysta z blokad na poziomie tabeli i nie będzie wykonywać równoczesnych zapisów, z wyjątkiem kilku przypadków, w których układ MyISAM jest optymalny. Jeśli nie wybierzesz InnoDB (który ma swoje własne problemy, takie jak nigdy nie zmniejszający się plik danych), może nie być lepiej z MySQL.
Kornel,
1

Witryna SQLite (część, do której się odwołujesz) wskazuje, że może być używana w różnych sytuacjach dla wielu użytkowników.

Powiedziałbym, że poradzi sobie całkiem sporo. Z mojego doświadczenia wynika, że ​​zawsze było bardzo szybko. Oczywiście musisz zindeksować swoje tabele, a podczas kodowania przeciwko niemu musisz upewnić się, że używasz sparamerizowanych zapytań i tym podobnych. Zasadniczo takie same czynności, jak w przypadku dowolnej bazy danych w celu poprawy wydajności.

jle
źródło
i korzystaj z transakcji. Ma to kluczowe znaczenie dla SQLite.
Kornel,
-1

Warto sprawdzić REAL SQL Server , który jest serwerem bazy danych zbudowanym na SQLite.

Paul Lefebvre
źródło
7
Nie sądzę, aby jakakolwiek strona uzasadnia wydanie 299 USD na „PRAWDZIWY SQL Server”, gdy większość witryn nie uzyskuje wystarczającego ruchu, aby nawet zacząć osiągać limity SQLLite.
djangofan