Σύνοψη αναφοράς για τους τύπους δεικτών SQL, τα μοτίβα σχεδίασης και τη συντήρηση.
Οι δείκτες ανταλλάσσουν αποθηκευτικό χώρο και ταχύτητα εγγραφής με ταχύτητα ανάγνωσης. Επιλέξτε τη δομή, περιορίστε τις γραμμές και κρατήστε το φούσκωμα υπό έλεγχο.
Πίνακας αναφοράς · 31 καταχωρήσεις
Δείκτες SQLExplained
31 of 31 rows
Τύποι δεικτών
Ισορροπημένο δέντρο για ισότητα, εύρη και ταξινομημένες σαρώσεις. Προεπιλογή στις περισσότερες βάσεις δεδομένων.
Χρήση για =, <, >, BETWEEN, ORDER BY. Όχι για αναζήτηση πλήρους κειμένου.
Δείκτης του οποίου το επίπεδο φύλλων είναι ο ίδιος ο πίνακας. Οι γραμμές αποθηκεύονται με τη σειρά του κλειδιού. Ένας ανά πίνακα.
Το InnoDB ομαδοποιεί κατά το πρωτεύον κλειδί. Οι πίνακες του SQL Server χωρίς τέτοιο είναι heaps.
Ξεχωριστή δομή που κρατά κλειδιά συν έναν δείκτη πίσω στον βασικό πίνακα. Πολλοί ανά πίνακα.
Σε heap αποθηκεύει row ID· σε ομαδοποιημένο πίνακα αποθηκεύει το κλειδί ομαδοποίησης.
Πίνακας κατακερματισμού μόνο για αναζητήσεις ισότητας. Ακριβές ταίριασμα σε σταθερό χρόνο.
Χρήση μόνο για πράξεις =· τα εύρη και η ταξινόμηση χρειάζονται B-tree. Ο κατακερματισμός σε πίνακες memory-optimized του SQL Server χρειάζεται bucket count κοντά στον αριθμό των γραμμών.
Γενικευμένο αντεστραμμένο ευρετήριο. Χαρτογραφεί τιμές σε γραμμές. Φτιαγμένο για arrays και πλήρες κείμενο.
Χρήση για jsonb, arrays, tsvector και αναζήτηση τριγραμμάτων. Πιο αργή δόμηση από το B-tree.
Γενικευμένο δέντρο αναζήτησης. Επεκτάσιμο για μη βαθμωτούς τύπους και ερωτήματα επικάλυψης.
Χρήση για γεωμετρικά εύρη, kNN και περιορισμούς αποκλεισμού. Το pg_trgm επιταχύνει το LIKE.
GiST με χωρική διαμέριση. Διαιρεί τα δεδομένα σε μη επικαλυπτόμενες περιοχές μέσω radix ή quad δέντρων.
Χρήση για σημεία, προθέματα IP και ταίριασμα προθεμάτων. Όχι για ερωτήματα επικάλυψης· χρησιμοποιήστε GiST.
Ευρετήριο περιοχής μπλοκ. Αποθηκεύει ελάχ/μέγ ανά περιοχή μπλοκ. Μικροσκοπικό αποτύπωμα.
Χρήση σε μεγάλους, φυσικά ταξινομημένους πίνακες. Φθηνή δόμηση, ασθενής εκλεκτικότητα.
Δείκτης αποθηκευμένος ως τμήματα στηλών αντί για γραμμές. Υψηλή συμπίεση, εκτέλεση σε παρτίδες.
Χρήση για αναλυτικές σαρώσεις πολλών γραμμών και λίγων στηλών. Οι αναζητήσεις μονής γραμμής είναι αργές.
Ειδικό αντεστραμμένο ευρετήριο λέξεων σε MySQL και SQL Server. Δημιουργείται ανά στήλη κειμένου.
Χρήση MATCH AGAINST ή CONTAINS. Το πλήρες κείμενο του Postgres χρησιμοποιεί αντίθετα GIN σε tsvector.
Δείκτης της Oracle που αποθηκεύει ένα bitmap ανά διακριτή τιμή. Κάθε bit επισημαίνει μία γραμμή.
Χρήση σε στήλες χαμηλής πληθικότητας σε αποθετήρια με έμφαση στην ανάγνωση. Οι ταυτόχρονες εγγραφές σειριοποιούνται ανά bitmap.
Στήλη δείκτη δηλωμένη DESC. Τα κλειδιά αυτής της στήλης αποθηκεύονται σε αντίστροφη σειρά.
Απαραίτητος για μεικτές ταξινομήσεις όπως (a ASC, b DESC). Οι απλές DESC ταξινομήσεις μπορούν επίσης να διαβάσουν έναν κανονικό δείκτη ανάποδα.
Δείκτης του MySQL 8 που αγνοεί ο βελτιστοποιητής. Συνεχίζει να συντηρείται σε κάθε εγγραφή.
Κρύψτε έναν δείκτη πριν τον διαγράψετε για να μετρήσετε την επίπτωση. Κάντε τον ξανά ορατό χωρίς επανακατασκευή.
Σχεδίαση
Πολυστήλικός δείκτης. Οι πρώτες στήλες πρέπει να ταιριάζουν με τη σειρά των φίλτρων του ερωτήματος.
Βάλτε πρώτα την ισότητα και μετά το εύρος. Δύο απλοί δείκτες δεν αντικαθιστούν έναν σύνθετο.
Δείκτης σε κατηγόρημα WHERE. Ο SQL Server τον ονομάζει φιλτραρισμένο δείκτη. Καλύπτει μόνο τις ταιριαστές γραμμές.
Δημιουργήστε δείκτη μόνο για τις γραμμές με active='t'. Κόβει στα δύο το μέγεθος και το κόστος εγγραφής.
B-tree με πρόσθετες μη κλειδιαίες στήλες. Οι σαρώσεις μόνο από δείκτη αποφεύγουν αναζητήσεις στο heap.
Προσθέστε τις συχνά ανακτώμενες στήλες μέσω INCLUDE. Διατηρεί τον δείκτη ταξινομήσιμο.
Δείκτης που απαγορεύει διπλές τιμές. Απορρίπτει εγγραφές που συγκρούονται.
Χρήση για φυσικά κλειδιά και περιορισμούς ένα-προς-ένα. Το UNIQUE NULL επιτρέπει πολλά NULL.
Δείκτης βασισμένος σε συνάρτηση στηλών αντί για τις ίδιες τις στήλες.
Δημιουργήστε δείκτη σε lower(email) ή date_trunc('day', created_at). Το ερώτημα πρέπει να επαναλάβει ακριβώς την ίδια έκφραση.
Κλάση τελεστών. Καθορίζει πώς ένας δείκτης συγκρίνει και αποθηκεύει τον τύπο μιας στήλης.
Ορίστε varchar_pattern_ops για LIKE 'abc%' χωρίς μετατροπή πεζών-κεφαλαίων. Οι προεπιλογές ταιριάζουν σε ισότητα και εύρη.
Πλάνο που απαντά ένα ερώτημα μόνο από σελίδες δείκτη. Το heap δεν διαβάζεται ποτέ.
Χρειάζεται κάθε ανακτώμενη στήλη στον δείκτη ή στη λίστα INCLUDE. Το Vacuum κρατά ενημερωμένο τον χάρτη ορατότητας.
Οι στήλες ξένων κλειδιών δεν παίρνουν αυτόματο δείκτη στον πίνακα που αναφέρεται.
Δημιουργήστε δείκτη για κάθε στήλη FK μέσω της οποίας κάνετε join ή διαγραφή. Οι διαγραφές CASCADE σαρώνουν τον θυγατρικό πίνακα χωρίς αυτόν.
Συντήρηση
Επιθεωρητής πλάνων. Δείχνει διαδοχικές σαρώσεις, επιλογές δεικτών και εκτιμήσεις κόστους.
Χρήση EXPLAIN (ANALYZE, BUFFERS). Ένα Seq Scan σε πίνακα 10M γραμμών σημαίνει ότι λείπει δείκτης.
Δειγματοληπτεί στήλες του πίνακα για στατιστικά βελτιστοποιητή. Τα ιστογράμματα καθοδηγούν την επιλογή δείκτη.
Εκτελέστε το μετά από μαζικές φορτώσεις. Παλιά στατιστικά προκαλούν seq scans σε δεικτοδοτημένες στήλες.
Κάθε δείκτης προσθέτει κόστος εγγραφής. Τα INSERT, UPDATE και DELETE πληρώνουν ανά δείκτη.
Διαγράψτε τους αχρησιμοποίητους δείκτες. Παρακολουθήστε τη χρήση στο pg_stat_user_indexes.
Προβολή του Postgres για τη χρήση ανά δείκτη. Μετρά σαρώσεις και αναγνωσμένες πλειάδες από τον τελευταίο μηδενισμό στατιστικών.
Φιλτράρετε με idx_scan = 0 για να βρείτε αχρησιμοποίητους δείκτες. Μηδενίστε τους μετρητές με pg_stat_reset().
Δημιουργεί δείκτη χωρίς να μπλοκάρει αναγνώσεις ή εγγραφές. Χρειάζεται δύο σαρώσεις πίνακα.
Δεν μπορεί να τρέξει μέσα σε συναλλαγή. Μια αποτυχημένη δημιουργία αφήνει έναν INVALID δείκτη προς διαγραφή.
Αφαιρεί έναν δείκτη και απελευθερώνει τον χώρο του. Παίρνει αποκλειστικό κλείδωμα από προεπιλογή.
Χρήση DROP INDEX CONCURRENTLY σε πολυάσχολους πίνακες. Ελέγξτε τα στατιστικά χρήσης πριν την αφαίρεση.
Ανακατασκευάζει έναν φουσκωμένο δείκτη. Ανακτά χώρο από νεκρές πλειάδες.
Χρήση REINDEX CONCURRENTLY σε παραγωγή. Χωρίς αυτό, τα κλειδώματα μπλοκάρουν εγγραφές.
Νεκρές πλειάδες και κενά σελίδων που συσσωρεύονται σε πίνακες MVCC και τους δείκτες τους.
Μετρήστε με pgstattuple. Συχνό Vacuum· REINDEX όταν ο νεκρός χώρος κυριαρχεί.
Ποσοστό γεμίσματος σελίδας κατά την εγγραφή. Ο ελεύθερος χώρος απορροφά μελλοντικές ενημερώσεις.
Χαμηλώστε το σε 70-90 σε πίνακες με έντονες ενημερώσεις. Οι γεμάτες σελίδες επιβάλλουν διαχωρισμούς σελίδων.
Επαναγράφει τον πίνακα φυσικά ταξινομημένο κατά έναν δείκτη. Λειτουργία μία φοράς.
Συνδυάζεται με BRIN για ταξινομημένα μπλοκ. Η σειρά δεν διατηρείται σε μελλοντικές εγγραφές.