MongoDB není magicky rychlejší. Pokud ukládáte stejná data, organizovaná v zásadě stejným způsobem a přistupujete k nim úplně stejným způsobem, pak byste opravdu neměli očekávat, že se vaše výsledky budou výrazně lišit. Koneckonců, MySQL i MongoDB jsou oba GPL, takže pokud by Mongo měl nějaký magicky lepší IO kód, pak by ho tým MySQL mohl začlenit do své kódové základny.
Lidé vidí skutečný výkon MongoDB především proto, že MongoDB vám umožňuje dotazovat se jiným způsobem, který je pro vaši pracovní zátěž rozumnější.
Vezměme si například návrh, který uchovává mnoho informací o komplikované entitě normalizovaným způsobem. To by mohlo snadno používat desítky tabulek v MySQL (nebo jakékoli relační databázi) k ukládání dat v normální formě, s mnoha indexy potřebnými k zajištění relační integrity mezi tabulkami.
Nyní zvažte stejný design s úložištěm dokumentů. Pokud jsou všechny tyto související tabulky podřízené hlavní tabulce (a často jsou), můžete být schopni modelovat data tak, aby byla celá entita uložena v jediném dokumentu. V MongoDB to můžete uložit jako jeden dokument v jedné kolekci. Zde začíná MongoDB a umožňuje vynikající výkon.
Chcete-li v MongoDB načíst celou entitu, musíte provést:
- Jedno vyhledání indexu v kolekci (za předpokladu, že entita je načtena podle ID)
- Načtení obsahu jedné databázové stránky (skutečného binárního dokumentu json)
Takže vyhledávání v b-stromu a čtení binární stránky. Log(n) + 1 IO. Pokud mohou být indexy zcela uloženy v paměti, pak 1 IO.
V MySQL s 20 tabulkami musíte provést:
- Jedno vyhledání indexu v kořenové tabulce (opět za předpokladu, že entita je načtena podle ID)
- U seskupeného indexu můžeme předpokládat, že hodnoty pro kořenový řádek jsou v indexu
- 20+ vyhledání rozsahu (doufejme na indexu) pro hodnotu pk entity
- Pravděpodobně se nejedná o seskupené indexy, takže stejných více než 20 vyhledávání dat, jakmile zjistíme, jaké jsou vhodné podřízené řádky.
Takže součet pro mysql, i za předpokladu, že všechny indexy jsou v paměti (což je těžší, protože jich je 20krát více), je asi 20 hledání rozsahu.
Tato vyhledávání rozsahů se pravděpodobně skládají z náhodných IO – různé tabulky budou určitě umístěny na různých místech na disku a je možné, že různé řádky ve stejném rozsahu ve stejné tabulce pro entitu nemusí být souvislé (v závislosti na tom, jak byla entita aktualizováno atd.).
Takže v tomto příkladu je konečný výsledek asi 20krát více IO s MySQL na logický přístup ve srovnání s MongoDB.
Takto může MongoDB zvýšit výkon v některých případech použití .