Porovnání databází na WZ

Dal jsem si tu práci a udělal jsem malý test databází dostupných na WZ. Aby to mělo nějaký smysl, tak zde jsou výsledky:

MySQL
na jiných serverech provádí několik stovek až tisíc čtení/zápisů za sekundu. Na WZ jsou to jen jednotky až desítky čtení/zápisů za sekundu. Pokud nepotřebujete speciálně MySQL, opravdu ji nepoužívejte.

SQLite
O této databázi se na WZ téměř neví. Je to souborová relační databáze, která má skvělý výkon. Naměřených 57000 insertů/s a 40000 selectů/s ji předurčuje tam, kde potřebujete relační databázi a nevadí vám, že je v souboru. Proti MySQL má výhodu také v tom, že má transakce a triggery.

CDB
Tuto konstantní databázi jsem měl kdysi jako favorita. 71000 zápisů/s a 29000 čtení/s není zase taková sláva, viz níže.

INIFILE
Není to v podstatě databáze, ale formát souboru velmi podobný .ini z Windows. Vhodná na konfigurační soubory, které je možné upravovat libovolným editorem. 1200 zápisů/s a 4200 čtení/s neohromí, navíc ta čísla s počtem záznamů klesají.

FLATFILE
Zajímavá databáze, ale výkonem neoplývá. Změny se přidávají na konec, během přepisování se tedy zvětšuje. 5800 zápisů/s a 6200 čtení/s také nic moc. Ale když se podívám zpětně na MySQL...

GDBM
Velice mě překvapilo, že tato databáze při čtení porazila konstantní databázi. Výkonem 77000 insertů/s a 150000 čtení/s se postavila vysoko nad ostatní databáze WZ. Proti této databázi hovoří fakt, že neumí jazyk SQL a používá se tedy jinak. Podobně jako předchozí databáze CDB, INIFILE a FLATFILE ukládá data jen jako klíč->hodnota.

K čemu je toto srovnání? Setkávám se s velkým množstvím aplikací, které využívaji MySQL jako úložiště dat typu key->value. To je naprosto nevhodné, protože tato databáze má spoustu jiných užitečných vlastností. Na WZ je ještě jedna relační databáze: SQLite. Bohužel jen na serverech s PHP5. Ovšem tam, kde je potřeba uložit sadu řetězců pod nějakým klíčem, je GDBM jasnou volbou.
Bezva, díky za přehled :-) Předpokládám, že ta sqlite používá soubor, který je uložen v mém webovém prostoru a který definuji při "připojování"? No, vlastně, co se ptám, hurá na googlení:-) Hlavně na tu GDBM jsem zvědavá, snad se k tomu večer dostanu :-)
Správně. Vše je popsáno na php.cz. Přidávám pár odkazů:

http://cz.php.net/manual/en/book.mysql.php
http://cz.php.net/manual/en/book.sqlite.php
http://cz.php.net/manual/en/book.dba.php

Testy jsem dělal na 5 zcela nezávislých serverech (včetně jednoho mého) s velmi rozdílnými výsledky. Ve všech byly databáze MySQL a PosgreSQL až u dna. Je to proto, že byly vytvořeny úplně k jiným účelům, než k tvorbě redakčních systémů a jiných webových aplikací. Jinou webovou aplikaci než typu e-shop apod. (a to striktně jen obchodní část bez popisů produktů a dalších blbinek) bych na relačních databázích určitě nedělal.
No, je fakt, že MySQL apod. skutečně budou ve většině případů na WZ (a nejen zde) tím takzvaným kanónem na vrabce. Zajímalo by mě, jaké by bylo srovnání výkonu při větším objemu dat (miliony záznamů). Ale na malých webech taková kvanta asi typicky nejsou :-) I když jsem nějak žila v přesvědčení, že je mysql určeno právě pro webové aplikace díky rychlým selektům na úkor aktualizací obsahu.
Tak po migraci na SQLite to vypadá, že mi to až na občasné záchvěvy běží rychleji, ještě jednou díky :-)
Miliony záznamů můžu testovat na svých serverech, ale na WZ si to moc netroufám.

Zkusil jsem tedy 500000 zápisů v DB4 (GDBM nemám, ale je obdobná) a dle očekávání výkon trochu poklesl. Výsledná databáze má 59 MB, její vytvoření mi zabralo 13 s, tedy 39000 insertů/s. Čtení trvalo 8 s, tedy 62000 čtení/s.

Na stejném stroji jsem v zápětí udělal stejný test s MySQL. Vzhledem k omezenému času PHP skriptu jsem snížil počet záznamů na 20000. Výsledek: zápis 8300 insertů/s, čtení 9900 selectů/s.

Testovací data: Klíč pseudonáhodné číslo integer (aby to nebyla posloupnost) data 80 byte textu. Před testem byly tabulky zrušeny a znovu založeny.

Přiznávám, že testovací data spíš nahrávala databázím NoSQL. Doménou SQL je totiž zpracování dat na straně serveru. Tedy to, co drtivá většina redakčních systémů a diskuzních fór dělá ve vlastní režii. Na zpracování účetnictví bych určitě sáhl po SQL, ale na weby jsou vhodnější databáze NoSQL. Nejen kvůli výkonu, ale i kvůli úspoře prostředků.

Vhodným mezičlánkem je právě SQLite. Je to souborová databáze a přitom používá jazyk SQL ve větší síle, než MySQL.

Ještě k SQLite: Na WZ podá nejlepší výkon přes třídu PDO. Možná je to díky využití PDO::prepare, které se při jiných metodách přístupu nedá použít.
PDO prozkoumám, díky.

Zpracováním dat na straně serveru myslíš uložené procedury, triggery a podobné srandy?

Taky by bylo zajímavé porovnat, jaký bude výkon při velkém počtu uživatelů. Ale teoreticky - pokud jde jen o čtení, tak by sqlite nemělo mít problém, pokud tedy nebude problém se souběžnými úlohami. Např. redakční systémy asi často sledují počet shlédnutí, takže zápisy by mohly být zajímavější. Ale mě na stránky stejně nikdo nechodí, tak čert to vem :-)
Ano, myslím tím uložené procedury, triggery atd. Divila by ses, ale někteří neumí ani pořádně napsat JOIN.

Konkurenční testy jsem zkoušel s GDBM a MySQL (bez potíží), ale SQLite zatím ještě ne. Čtení by mělo být úplně bez problémů, při zápisu si tuším na okamžik zamkne celou databázi/tabulku, tak by také neměl nastat problém.

Proti MySQL (na WZ je jen MyISAM) můžeš v SQLite navíc použít BEGIN TRANSACTION ... COMMIT/ROLLBACK. Pokud budeš dávat víc insertů najednou (nasypávání dat), tak doporučuji. Samozřejmě i v ostatních obvyklých případech. Výrazně se to tím zrychlí.