Πώς να βελτιώσετε τα ερωτήματα με την ευρετηρίαση MongoDB

Pos Na Beltiosete Ta Erotemata Me Ten Eureteriase Mongodb



Η βελτίωση της ταχύτητας ερωτημάτων είναι απαραίτητη για το MongoDB και όλα τα άλλα συστήματα βάσεων δεδομένων. Χτίζοντας δομές δεδομένων που βοηθούν το MongoDB να εντοπίζει εγγραφές πιο γρήγορα, η ευρετηρίαση είναι μια ισχυρή προσέγγιση για την επιτάχυνση και τη βελτιστοποίηση των αναζητήσεων. Τα ευρετήρια περιλαμβάνουν αντίγραφα ορισμένων δεδομένων από αρχεία για να κάνουν τις έρευνες πιο αποτελεσματικές. Αυτό απλοποιεί την προσπάθεια που απαιτείται για την ανταπόκριση σε αιτήματα στο MongoDB. Σε αυτόν τον οδηγό, θα συζητήσουμε τη χρήση ευρετηρίων με τη βοήθεια διαφορετικών τύπων ευρετηρίασης.

Δημιουργία Συλλογής

Πριν χρησιμοποιήσουμε ευρετήρια, πρέπει να δημιουργήσουμε μια νέα συλλογή στο MongoDB μας. Έχουμε ήδη δημιουργήσει ένα και εισάγουμε 10 έγγραφα, με το όνομα «Dummy». Η συνάρτηση find() MongoDB εμφανίζει όλες τις εγγραφές από τη συλλογή 'Dummy' στην οθόνη κελύφους MongoDB παρακάτω.

test> db.Dummy.find()







Επιλέξτε Τύπος ευρετηρίου

Πριν δημιουργήσετε ένα ευρετήριο, πρέπει πρώτα να προσδιορίσετε τις στήλες που θα χρησιμοποιούνται συνήθως στα κριτήρια ερωτημάτων. Τα ευρετήρια έχουν καλή απόδοση σε στήλες που φιλτράρονται, ταξινομούνται ή αναζητούνται συχνά. Τα πεδία με μεγάλη πληθώρα (πολλές διαφορετικές τιμές) είναι συχνά εξαιρετικές επιλογές ευρετηρίασης. Ακολουθούν μερικά παραδείγματα κώδικα για διαφορετικούς τύπους ευρετηρίου.



Παράδειγμα 01: Ευρετήριο μεμονωμένου πεδίου

Είναι ίσως ο πιο θεμελιώδης τύπος ευρετηρίου, ο οποίος ευρετηριάζει μια στήλη για να βελτιώσει την ταχύτητα ερωτήματος σε αυτήν τη στήλη. Αυτός ο τύπος ευρετηρίου χρησιμοποιείται για ερωτήματα στα οποία χρησιμοποιείτε ένα μοναδικό πεδίο κλειδιού για να υποβάλετε ερώτημα στις εγγραφές συλλογής. Ας υποθέσουμε ότι χρησιμοποιείτε το πεδίο 'τύπος' για να ρωτήσετε τις εγγραφές της συλλογής 'Dummy' στη συνάρτηση εύρεσης όπως παρακάτω. Αυτή η εντολή θα εξετάσει ολόκληρη τη συλλογή, η οποία μπορεί να πάρει πολύ χρόνο για να επεξεργαστούν τεράστιες συλλογές. Ως εκ τούτου, πρέπει να βελτιστοποιήσουμε την απόδοση αυτού του ερωτήματος.



test> db.Dummy.find({type: 'EMP' })





Οι εγγραφές της παραπάνω συλλογής Dummy έχουν βρεθεί χρησιμοποιώντας το πεδίο 'τύπος', δηλαδή περιέχουν μια συνθήκη. Επομένως, το ευρετήριο ενός κλειδιού μπορεί να χρησιμοποιηθεί εδώ για τη βελτιστοποίηση του ερωτήματος αναζήτησης. Έτσι, θα χρησιμοποιήσουμε τη συνάρτηση createIndex() του MongoDB για να δημιουργήσουμε ένα ευρετήριο στο πεδίο 'type' της συλλογής 'Dummy'. Η απεικόνιση της χρήσης αυτού του ερωτήματος εμφανίζει την επιτυχή δημιουργία ενός ευρετηρίου με ένα κλειδί με το όνομα 'type_1' στο κέλυφος.

test> db.Dummy.createIndex({ type: 1 })

Ας χρησιμοποιήσουμε το ερώτημα find() μόλις κερδίσει χρησιμοποιώντας το πεδίο 'type'. Η λειτουργία θα είναι σημαντικά ταχύτερη τώρα από τη συνάρτηση find() που χρησιμοποιήθηκε προηγουμένως καθώς το ευρετήριο είναι σε θέση, επειδή το MongoDB μπορεί να χρησιμοποιήσει το ευρετήριο για να ανακτήσει γρήγορα τις εγγραφές με τον τίτλο εργασίας που ζητήθηκε.



test> db.Dummy.find({type: 'EMP' })

Παράδειγμα 02: Σύνθετος Δείκτης

Μπορεί να θέλουμε να αναζητήσουμε αντικείμενα με βάση διάφορα κριτήρια σε ορισμένες περιπτώσεις. Η εφαρμογή ενός σύνθετου ευρετηρίου για αυτά τα πεδία μπορεί να βοηθήσει στη βελτίωση της απόδοσης του ερωτήματος. Ας πούμε, αυτή τη φορά, θέλετε να κάνετε αναζήτηση από τη συλλογή 'Dummy' χρησιμοποιώντας πολλά πεδία που περιέχουν διαφορετικές συνθήκες αναζήτησης όπως εμφανίζεται το ερώτημα. Αυτό το ερώτημα αναζητούσε εγγραφές από τη συλλογή όπου το πεδίο 'τύπος' έχει οριστεί σε 'emp' και το πεδίο 'sal' είναι μεγαλύτερο από 350.

Ο λογικός τελεστής $gte έχει χρησιμοποιηθεί για την εφαρμογή της συνθήκης στο πεδίο 'sal'. Συνολικά δύο δίσκοι επιστράφηκαν μετά από αναζήτηση ολόκληρης της συλλογής, η οποία αποτελείται από 10 δίσκους.

test> db.Dummy.find({type: 'EMP' , sal: {$gte: 350 } })

Ας δημιουργήσουμε ένα σύνθετο ευρετήριο για το προαναφερθέν ερώτημα. Αυτός ο σύνθετος δείκτης έχει πεδία 'τύπος' και 'sal'. Οι αριθμοί '1' και '-1' αντιπροσωπεύουν αύξουσα και φθίνουσα σειρά, αντίστοιχα, για τα πεδία 'τύπος' και 'sal'. Η ακολουθία των στηλών του σύνθετου ευρετηρίου είναι σημαντική και πρέπει να αντιστοιχεί στα μοτίβα ερωτημάτων. Το MongoDB έχει δώσει το όνομα 'type_1_sal_-1' σε αυτόν τον σύνθετο δείκτη όπως εμφανίζεται.

test> db.Dummy.createIndex({ type: 1 , θα:- 1 })

Αφού χρησιμοποιήσαμε το ίδιο ερώτημα find() για να αναζητήσουμε εγγραφές με την τιμή του πεδίου 'type' ως 'emp' και την τιμή του πεδίου 'sal' μεγαλύτερη από ίση με 350, έχουμε το ίδιο αποτέλεσμα με μια μικρή αλλαγή στη σειρά. σε σύγκριση με το προηγούμενο αποτέλεσμα ερωτήματος. Η εγγραφή μεγαλύτερης τιμής για το πεδίο 'sal' βρίσκεται τώρα στην πρώτη θέση, ενώ η μικρότερη είναι στη χαμηλότερη σύμφωνα με το '-1' που έχει οριστεί για το πεδίο 'sal' στον παραπάνω σύνθετο δείκτη.

test> db.Dummy.find({type: 'EMP' , sal: {$gte: 350 } })

Παράδειγμα 03: Ευρετήριο κειμένου

Μερικές φορές, μπορεί να αντιμετωπίσετε μια κατάσταση στην οποία θα πρέπει να αντιμετωπίσετε ένα μεγάλο σύνολο δεδομένων, όπως μεγάλες περιγραφές προϊόντων, συστατικών κ.λπ. Ένα ευρετήριο κειμένου μπορεί να είναι χρήσιμο για την πραγματοποίηση αναζητήσεων πλήρους κειμένου σε ένα μεγάλο πεδίο κειμένου. Για παράδειγμα, δημιουργήσαμε μια νέα συλλογή με το όνομα 'Test' στη βάση δεδομένων δοκιμών μας. Εισήχθησαν συνολικά 6 εγγραφές σε αυτήν τη συλλογή χρησιμοποιώντας τη συνάρτηση insertMany() σύμφωνα με το ερώτημα find() παρακάτω.

test> db.Test.insertMany([

{όνομα: 'Ανα' , απο: «Ζει στο Λονδίνο και είναι καλή δασκάλα» },

{όνομα: 'Ροβέρτος' , απο: «Είναι ένας φοβερός ποδοσφαιριστής» },

{όνομα: 'από' , απο: 'Μπορεί να ταξιδέψω στο Ντουμπάι' },

{όνομα: 'Ιάκωβος' , απο: «Είναι εντυπωσιακός και πλούσιος». },

{όνομα: 'Κίλιαν' , απο: 'Μια ταινία σούπερ αρχή μόλις έγινε φήμη σε λίγα δευτερόλεπτα' },

{όνομα: 'Γνώση' , απο: 'Λάτρης του φαγητού. Μπορεί να σε φάει και εσένα.' }

])

Τώρα, θα δημιουργήσουμε ένα ευρετήριο κειμένου στο πεδίο 'Des' αυτής της συλλογής, χρησιμοποιώντας τη συνάρτηση createIndex() του MongoDB. Η λέξη-κλειδί 'κείμενο' στην τιμή πεδίου εμφανίζει τον τύπο ενός ευρετηρίου, που είναι ευρετήριο 'κείμενο'. Το όνομα ευρετηρίου, des_text, έχει δημιουργηθεί αυτόματα.

test> db.Test.createIndex({ des: 'κείμενο' })

Τώρα, η συνάρτηση find() έχει χρησιμοποιηθεί για την εκτέλεση της «αναζήτησης κειμένου» στη συλλογή μέσω του ευρετηρίου «des_text». Ο τελεστής $search χρησιμοποιήθηκε για να αναζητήσει τη λέξη 'food' στα αρχεία συλλογής και να εμφανίσει τη συγκεκριμένη εγγραφή.

test> db.Test.find({ $text: { $search: 'τροφή' }});

Επαλήθευση ευρετηρίων:

Μπορείτε να ελέγξετε και να καταγράψετε όλα τα εφαρμοσμένα ευρετήρια διαφορετικών συλλογών στο MongoDB σας. Για αυτό, χρησιμοποιήστε τη μέθοδο getIndexes() μαζί με το όνομα μιας συλλογής στην οθόνη κελύφους MongoDB. Χρησιμοποιήσαμε αυτήν την εντολή ξεχωριστά για τις συλλογές 'Test' και 'Dummy'. Αυτό εμφανίζει όλες τις απαραίτητες πληροφορίες σχετικά με τα ενσωματωμένα ευρετήρια και τα ευρετήρια που ορίζονται από τον χρήστη στην οθόνη σας.

test> db.Test.getIndexes()

test> db.Dummy.getIndexes()

Απόθεση ευρετηρίων:

Ήρθε η ώρα να διαγράψετε τα ευρετήρια που είχαν δημιουργηθεί προηγουμένως για τη συλλογή χρησιμοποιώντας τη συνάρτηση dropIndex() μαζί με το ίδιο όνομα πεδίου στο οποίο είχε εφαρμοστεί το ευρετήριο. Το παρακάτω ερώτημα δείχνει ότι το μεμονωμένο ευρετήριο έχει αφαιρεθεί.

test> db.Dummy.dropIndex({type: 1 })

Με τον ίδιο τρόπο, ο σύνθετος δείκτης μπορεί να πέσει.

test> db.Dummy.drop index({type: 1 , θα: 1 })

συμπέρασμα

Επιταχύνοντας την ανάκτηση δεδομένων από το MongoDB, η ευρετηρίαση είναι απαραίτητη για τη βελτίωση της αποτελεσματικότητας των ερωτημάτων. Ελλείψει ευρετηρίων, το MongoDB πρέπει να αναζητήσει ολόκληρη τη συλλογή για αντίστοιχες εγγραφές, κάτι που γίνεται λιγότερο αποτελεσματικό όσο αυξάνεται το μέγεθος του συνόλου. Η ικανότητα του MongoDB να ανακαλύπτει γρήγορα τις σωστές εγγραφές χρησιμοποιώντας τη δομή της βάσης δεδομένων ευρετηρίου επιταχύνει την επεξεργασία των ερωτημάτων όταν χρησιμοποιείται κατάλληλη ευρετηρίαση.