MongoDB - NoSQL - użycie explain()

MongoDB - NoSQL - użycie explain()
aPsikus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0

Za pomocą pętli utworzyłem kolekcję.

Kopiuj
for (var i = 1; i <= 30000; i++) {db.liczby.insert( { x : i } )}

Następnie proste zapytanie

Kopiuj
db.liczby.find( {$and:[{"x":{$gte:10000}}, {"x":{$lte:15000}}]})

I teraz tak: wykorzystaj metodę explain by otrzymać informacje o wykonaniu ostatniego zadania.

Kopiuj
db.liczby.find().explain()

Później otworzenie indeksów, i ponownie explain.

Kopiuj
db.liczby.createIndex({x:1})
db.liczby.find().explain()

Tyle, że wyniki explain się nie różnią, a powinny.
Zgodnie z dokumentacją:

Stages are descriptive of the operation; e.g.
COLLSCAN for a collection scan
IXSCAN for scanning index keys
FETCH for retrieving documents
SHARD_MERGE for merging results from shards
SHARDING_FILTER for filtering out orphan documents from shards

A jak widać dla obu jest COLLSCAN.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

W jaki sposób indeks miałby wpłynąć na wynik zapytania, które tak czy siak musi zwrócić wszystkie wiersze? :-P

aPsikus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0

Zapytanie nie zwraca wszystkich wierszy - 5000 spośród 30000.

No właśnie tego nie wiem.
Miałem znaleźć różnicę. Spodziewam się jej, ale nie widzę.
Więc nie wiem czy błędne założenie czy też coś źle wykonałem.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Zapytanie nie zwraca wszystkich wierszy - 5000 spośród 30000.

Nieprawda: db.liczby.find() zwraca wszystkie wiersze, stąd explain na tym właśnie zapytaniu nie będzie próbował wykorzystać indeksu.

Uruchom za to db.liczby.find( {$and:[{"x":{$gte:10000}}, {"x":{$lte:15000}}]}).explain() ;-)

aPsikus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0
Patryk27 napisał(a):

Zapytanie nie zwraca wszystkich wierszy - 5000 spośród 30000.

Nieprawda: db.liczby.find() zwraca wszystkie wiersze, stąd explain na tym właśnie zapytaniu nie będzie próbował wykorzystać indeksu.

Uruchom za to db.liczby.find( {$and:[{"x":{$gte:10000}}, {"x":{$lte:15000}}]}).explain() ;-)

No i podziękował :)
Po prostu użyłem explain() nie z tym zapytaniem co trzeba.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.