Baza danych SQLite stanowi ciekawą alternatywę dla niezwykle popularnego serwera MySQL. Jest niezwykle prosta w utrzymaniu, bo cała baza mieści się w 1 pliku, który można łatwo skopiować lub przenieść ale mimo tej pozornej prostoty posiada obsługę transakcji, triggerów, widoków, możliwość tworzenia własnych funkcji oraz wykonywania zagnieżdżonych zapytań. Nie korzysta ona z typowego silnika pracującego w tle ale ze zwykłej biblioteki dostępnej dla większości współczesnych języków programowania. Powszechnie panująca opinia mówi, że o ile odczyt z bazy SQLite jest do zniesienia to już zapis zupełnie ją dyskredytuje. Przeprowadziłem kilka testów (dość uproszczonych ale oddających ideę) i na podstawie wyników doszedłem do ciekawych wniosków. Testy przeprowadziłem porównując bazy SQLite i MySQL. W obu przypadkach dla operacji zapisu testy podzieliłem na zapis każdego zapytania osobno oraz stosując grupowe wykonanie serii zapytań z użyciem transakcji (BEGIN i COMMIT). W obu bazach przeprowadziłem osobne testy dla tabel typu MEMORY czyli przechowywanych w pamięci a w przypadku bazy MySQL dodatkowo uwzględniłem tabele typu MyISAM i InnoDB.

Na początek kilka szczegółów technicznych:

- baza MySQL 5.0.51
- baza SQLite 2.8.17
- komputer z procesorem Intel Core2 Duo 2GHz, 2 GB pamięci DDR2 i systemem MS Windows XP SP2
- testy przeprowadzone w PHP 5.2.5 na serwerze Apache 2.2.6

Wyniki przeprowadzonych testów:

1000 zapytań INSERT:
- SQLite - 74.157 sek.
- SQLite (BEGIN-COMMIT) - 0.16181 sek.
- SQLite (Memory, BEGIN-COMMIT) - 0.13252 sek.
- MySQL (MyISAM) - 0.11942 sek.
- MySQL (InnoDB) - 25.019 sek.
- MySQL (InnoDB, BEGIN-COMMIT) - 0.16452 sek.
- MySQL (Memory) - 0.08914 sek.

Powyższe wyniki są bardzo różne co wynika z typu tabel oraz sposobu przeprowadzenia operacji. Baza SQLite domyślnie korzysta z transakcji przez co wykonanie 1000 zapytań bez rozpoczęcia transakcji przed ich wykonaniem i zakończenia jej po wykonaniu wszystkich zapytań skutkuje drastycznym spadkiem wydajności. Podobna sytuacja dotyczy bazy MySQL, która przy zastosowaniu transakcji (tabela typu InnoDB) jest równie wrażliwa na sterowanie transakcjami. W przypadku zastosowania BEGIN przed wykonaniem zapytań i COMMIT po ich wykonaniu czasy w obu bazach są bardzo podobne. Najszybciej wykonanie wszystkich zapytań przebiegło w bazie MySQL z wykorzystaniem tabeli typu MyISAM, co jest zupełnie naturalne ze względu na brak obsługi transakcji. Zastosowanie tabel typu MEMORY w obu przypadkach zgodnie z przypuszczeniami przyśpieszyło wykonanie zapytań.

1000 identycznych zapytań SELECT * FROM tabela:
- SQLite - 0.77956 sek.
- SQLite (Memory) - 0.76029 sek.
- MySQL (MyISAM) - 0.86335 sek.
- MySQL (InnoDB) - 1.31506 sek.
- MySQL (Memory) - 0.77291 sek.

W przypadku 1000 identycznych zapytań SQLite okazuje się być nieznacznie szybszy zarówno dla tabel typu MEMORY jak i zwykłych. Najwolniejszy okazała się tabela InnoDB w bazie MySQL.

1000 unikatowych zapytań SELECT * FROM tabela WHERE pole LIKE ‘zmienna_wartosc%’ :
- SQLite - 0.6806 sek.
- SQLite (Memory) - 0.71688 sek.
- MySQL (MyISAM) - 0.16667 sek.
- MySQL (InnoDB) - 0.13743 sek.
- MySQL (Memory) - 0.33858 sek.

Dla 1000 różnych zapytań z frazą LIKE baza SQLite okazała się wolniejsza niż konkurenci zarówno w przypadku tabeli typu MEMORY jak i standardowej). Co ciekawe zastosowanie w bazie MySQL tabeli typu InnoDB przyśpieszyło operację pobierania danych a użycie tabeli typu MEMORY ją spowolniło.

Powyższe wyniki wskazują, iż czasy wykonywania zapytań modyfikujących tabele w porównywalnych warunkach (czyli MySQL korzystające z tabel InnoDB) są zbliżone co jest niewątpliwym sukcesem bazy SQLite, tym bardziej, iż obalają powszechnie panującą opinię o znacznym spadku wydajności bazy SQLite w przypadku zapisu danych. Porównanie odczytu danych zależy natomiast od typu zapytań.

Na koniec kilka linków związanych z SQLite:
- http://www.sqlite.org - oficjalna strona projektu
- http://www.php.rk.edu.pl/w/p/optymalizacja-sqlite - optymalizacja SQLite
- http://www.sqlite.org/cvstrac/wiki?p=SpeedComparison - porównanie wydajności baz danych na opicjalnej stronie projektu