Mezi úkoly spojené se správou databází patří zlepšování výkonu pomocí různých strategií. Indexování je jedním z tipů, které zlepšují propustnost operací usnadněním přístupu k datům k dotazům. Činí tak minimalizací počtu diskových přístupů požadovaných při zpracování dotazu. Selhání použití indexů v MongoDB přinutí databázi provést úplnou kontrolu kolekce, to znamená prohledat všechny dokumenty v kolekci, aby se vybraly dokumenty, které odpovídají zadanému dotazu. Je zřejmé, že to zabere spoustu času, zvláště pokud se jedná o tolik dokumentů. Stručně řečeno, indexy podporují efektivní provádění dotazů.
Indexy MongoDB
Vzhledem k tomu, že očekáváme uložení mnoha dokumentů do kolekce MongoDB, musíme najít způsob, jak uložit malou část dat pro každý dokument do jiného oddílu pro snadné procházení pomocí indexů. Index uloží konkrétní hodnotu pole nebo pole a poté tato data seřadí v pořadí podle hodnoty tohoto pole. S tímto řazením je podporováno efektivní párování dotazů a operace dotazů založené na rozsahu. Indexy jsou definovány na úrovni kolekce a jsou podporovány jakýmkoli polem nebo vloženým polem dokumentů v kolekci.
Když vytvoříte dokument, MongoDB ve výchozím nastavení přiřadí pole _id, pokud není zadáno, a udělá z něj jedinečný index pro daný dokument. V zásadě jde o to, aby se zabránilo vložení stejného dokumentu více než jedním do této kolekce. Kromě toho je u sharded clusteru vhodné použít toto pole _id jako součást výběru shard klíčů, jinak musí být v poli _id určitá jedinečnost dat, aby se předešlo chybám.
Vytvoření indexu pro kolekci
Za předpokladu, že jste do své kolekce vložili nějaká data a chcete poli přiřadit index, můžete toho dosáhnout pomocí metody createIndex, tj.
Řekněme, že máte tato data json:
{
_id:1,
Name: “Sepp Maier”,
Country: “Germany”
}
Z pole Název můžeme udělat sestupný index pomocí:
db.collection.createIndex({Name: -1})
Tato metoda vytvoří index se stejnou specifikací, pokud pouze ještě neexistuje.
Typy indexů v MongoDB
MongoDB zahrnuje různé typy dat, proto jsou pro podporu těchto datových typů a dotazů odvozeny různé typy indexů.
-
Jedno pole
Pomocí jediného pole dokumentu lze z pole vytvořit index vzestupně nebo sestupně, stejně jako ve výše uvedeném příkladu. Kromě toho můžete vytvořit index na vloženém dokumentu jako celku, například:
{ _id: “xyz”, Contact:{ email: “[email protected]”, phone:”+420 78342823” }, Name: “Sergio” }
Kontaktní pole je vložený dokument, takže z něj můžeme udělat vzestupný index příkazem:
db.collection.createIndex({ Contact: 1})
V dotazu můžeme načíst dokument jako:
db.collection.find({ Contact: {email: “[email protected]”, phone:”+420 78342823”} })
Osvědčeným postupem je vytváření indexu na pozadí, zejména pokud se jedná o velké množství dat, protože aplikace potřebuje při vytváření indexu k datům přistupovat.
-
Složený index
Složené indexy se často používají k usnadnění operace řazení v rámci dotazu a k podpoře dotazů, které se shodují ve více polích. Syntaxe pro vytvoření složeného indexu je:
db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )
Vytvoření složeného indexu pro ukázková data níže
{ _id: “1”, Name: “Tom”, Age: 24, Score:”80” } db.collection.createIndex({ Age: 1, Score:-1})
Úvahy:
- Lze podporovat limit pouze 32 polí.
- Hodnota pole bude definovat typ indexu, tj. 1 je vzestupný a -1 sestupný.
- Nevytvářejte složené indexy, které mají hašovaný typ indexu.
- Pořadí polí uvedených ve složeném indexu je důležité. Řazení bude provedeno v souladu s pořadím polí.
-
Index více klíčů
V určitém okamžiku můžete mít pole s uloženým obsahem pole. Když jsou tato pole indexována, vytvoří se samostatné položky rejstříku pro každý prvek. Pomáhá tedy dotazu vybrat dokumenty, které se skládají z polí, pomocí shody na prvku nebo prvcích polí. To se provádí automaticky MongoDB, takže není třeba explicitně specifikovat typ více klíčů. Od verze 3.4 MongoDB sleduje, která indexovaná pole způsobují, že index je index s více klíči. S tímto sledováním může databázový dotazovací stroj používat přísnější hranice indexu.
Omezení víceklíčového indexu
- Ve víceklíčovém indexování dokumentu v kolekci lze použít pouze jedno pole pole. Tj. Nemůžete vytvořit víceklíčový index pro příkaz a data níže
Nemůžete vytvořit víceklíčový index{ _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
{ nums: 1, scores: 1 }
- Pokud již víceklíčový index existuje, nemůžete vložit dokument, který toto omezení porušuje. To znamená, že pokud máme
Po vytvoření složeného víceklíčového indexu, pokusu o vložení dokumentu, kde pole nums i score jsou pole, se vložení databáze nezdaří.{ _id: 1, nums: 1, scores: [ 30, 60 ]} { _id: 1, nums: [ 1, 2 ], scores: 30}
- Ve víceklíčovém indexování dokumentu v kolekci lze použít pouze jedno pole pole. Tj. Nemůžete vytvořit víceklíčový index pro příkaz a data níže
-
Textové indexy
Textové indexy se často používají ke zlepšení vyhledávacích dotazů na řetězec v kolekci. Neukládají zastavovací slova specifická pro daný jazyk (tj. „the“, „a“, „nebo“). Kolekce může mít maximálně jeden textový index. Chcete-li vytvořit textový index:
db.collection.createIndex({Name:”text”})
Můžete také indexovat více polí, např.
db.collection.createIndex({ Name:”text”, place:”text” })
Složený index může obsahovat klíč textového indexu v kombinaci s klíčem vzestupného/sestupného indexu, ale:
- Při vytváření složeného textového indexu musí být všechny klíče textového indexu v dokumentu specifikace indexu vedle sebe.
- Do indexu složeného textu by neměly být zahrnuty žádné další speciální typy indexů, jako jsou víceklíčová indexová pole.
- Chcete-li provést $textové vyhledávání, musí predikát dotazu zahrnovat podmínky shody na předchozích klíčích.
-
Hašované indexy
Sharding je jednou z technik používaných v MongoDB ke zlepšení horizontálního škálování. Sdílení často zahrnuje koncept založený na hash pomocí hashovaných indexů. Tyto indexy zobrazují náhodnější rozložení hodnot podél jejich rozsahu, ale podporují pouze rovnocenné shody a nemohou podporovat dotazy založené na rozsahu.
Celkové provozní aspekty indexů
- Každý index vyžaduje alespoň 8 kB datového prostoru.
- Je-li aktivní, každý index zabere určité místo na disku a paměti. To je důležité při sledování při plánování kapacity.
- Pro kolekci s vysokým poměrem čtení a zápisu zlepšují další indexy výkon a neovlivňují neindexované operace čtení.
Omezení použití indexů
- Přidání indexu má určitý negativní dopad na výkon operací zápisu, zejména u kolekcí s vysokým poměrem zápisu ke čtení. Indexy budou drahé v tom, že každá vložka musí také aktualizovat jakýkoli index.
- MongoDB nevytvoří, neaktualizuje index ani nebude vkládat do indexované kolekce, pokud položka rejstříku pro existující dokument překročí limit klíče indexu.
- U stávajících segmentovaných kolekcí se migrace bloku nezdaří, pokud blok obsahuje dokument obsahující indexované pole, jehož položka rejstříku překračuje limit klíče indexu.
Závěr
Existuje mnoho způsobů, jak zlepšit výkon MongoDB, indexování je jedním z nich. Indexování usnadňuje operace dotazů tím, že snižuje latenci, během níž jsou data načítána, tím, že se nějakým způsobem minimalizuje počet dokumentů, které je třeba naskenovat. Před rozhodnutím o použití konkrétního typu indexu je však třeba provést několik úvah. Kolekce s vysokým poměrem čtení a zápisu mají tendenci využívat indexy lépe než kolekce s vysokými operacemi zápisu a čtení.