TLDR: Indexarea este doar o modalitate de grupare a documentelor, împărțind colecțiile în grupuri pentru a accelera performanța
Overview
Indexul crește performanța interogării, precum și performanța de căutare
Ideea de indexare în MongoDB este similară cu indexul oricărei cărți, care crește viteza de căutare a unei pagini. Indexul din MongoDB crește viteza de căutare a documentelor
Cum funcționează indexurile?
În primul rând, să înțelegem cum se declară indexul în MongoDB
collectionName.createIndex({field:value}) //for creating indexcollectionName.dropIndex({field:value}) //for removing index
Aici, câmpul este „fieldName” care va fi indexat. „Value” poate fi -1 sau 1 sau „text”.
Acesta definește tipul de index, 1 sau -1 crește performanța interogării find(), în timp ce „text” este utilizat pentru căutare.
1 și -1 dau ordinea indexului. Ascendent = -1 & Descendent =1
Acum, cum funcționează indicii sub capotă?
Imaginați-vă o colecție de utilizatori, fiecare document conținând diverse informații, una dintre ele fiind scorul.
Să spunem că vrem ca toți utilizatorii să aibă scorul 23.
Când nu există un index, MongoDB trece prin fiecare document pentru a găsi documentul interogat, acest lucru se numește scanare de colecție, MongoDB are o prescurtare pentru acest COLLSCAN (acest lucru se numește scanare de tabel în bazele de date relaționale)
Cum putem optimiza acest lucru?
Pentru a optimiza acest lucru putem crea un tabel cu o coloană pentru scor și o altă coloană pentru referințe care va conține ID-urile documentelor cu un anumit scor. Acum trebuie să scanăm doar acel tabel, în loc să scanăm întreaga bază de date. Acest lucru este mult mai rapid. Aceasta este exact ceea ce este un index.
Indexurile ajută MongoDB să restrângă setul de date pe care va trebui să îl scaneze. Acest lucru se numește Index Scan, MongoDB are și o prescurtare pentru acest lucru IXNSCAN
Iată o reprezentare vizuală a unui Index de scor și a cartografierii sale.
Îmbunătățirea performanței prin Index este vizibilă doar atunci când numărul de documente trece de 100K sau cam așa ceva.
Puteți compara chiar dvs. comparând două interogări, una cu un câmp indexat și una fără Index
db.<collection name>.find(query).explain()
Se va returna un obiect
obiect.winingPlan.stage va spune tipul de scanare COLLSCAN sau IXNSCAN
dar nu vă va spune timpul de execuție
utilizați metoda explain(‘executionStat’) înaintea metodei de interogare precum find
.
db.<collection name>explain('executionStat').find(query)
executionTimeMillis vă va spune timpul petrecut în execuție
Downsides of Index
Indexurile nu sunt gratuite, Indicii costă spațiu. Indicii pot crește viteza de citire, dar ori de câte ori se scrie ceva, indexul trebuie actualizat pentru a rezolva acest lucru, folosim B- tree, facem unele calcule înainte de inserție, astfel încât să fie mai rapid.
B-Tree
Indexurile nu sunt un tabel de grupuri, din punct de vedere conceptual este de fapt un B-Tree (Binary Tree) nu doar MongoDB, baza de date SQL folosește, de asemenea, B Tree pentru indexare
acest video explică cel mai bine B Tree
.