Ich verwende Indizes wie die meisten Entwickler (hauptsächlich bei ... well! Index), aber ich bin mir sicher, dass es viele subtile Möglichkeiten gibt, eine Datenbank mithilfe von index zu optimieren. Ich bin nicht sicher, ob es spezifisch für eine Implementierung eines DBMS ist.
Meine Frage lautet: Was sind gute Beispiele für die Verwendung des Index (außer in einfachen, offensichtlichen Fällen), und wie optimiert ein DBMS seine Datenbank, wenn Sie einen Index für eine Tabelle angeben?
Antworten:
Stellen Sie sich einen Index als "Inhaltsverzeichnis" vor. Dies ist eine geordnete Liste von Zeigern auf Positionen in einer Datei, auch Offsets genannt. Angenommen, Sie haben Millionen von Datensätzen in einer Tabelle gespeichert, anstatt in der Tabelle nach Übereinstimmungskriterien zu suchen. Es ist viel schneller, auf eine geordnete Liste für Übereinstimmungen zu verweisen und dann die Zeiger auf die spezifischen übereinstimmenden Zeilen zu stapeln. Ein perfektes Beispiel für einen Index ist ein Tabellen-Primärschlüsselfeld, in der Regel das Feld "id". Wenn Sie die Zeilen-ID # 11234566 möchten, können Sie den Index viel schneller nach einem Zeiger auf die Daten fragen, als wenn Sie die Datenquelle nach Position 11234566 durchsuchen.
Hier ist eine nicht so offensichtliche Verwendung der Indizierung:
Ihre Operation kann Ihren Protokolldatensatz erstellen, erstellt dann jedoch einen Verweis auf eine indizierte Datumszeit, die schneller durchsucht / sortiert werden kann als Ihre Protokolltabelle. Verbinden Sie dann Ihre Protokolltabelle mit einem eigenen Primärschlüssel. Wenn Sie mich brauchen, um dies zu erweitern, lassen Sie es mich wissen. Ich hoffe das macht Sinn.
Beispielabfrage:
quelle
Ein Punkt, den viele Leute vermissen, ist, dass ein DBMS häufig (oder nur) einen Index pro Tabellenreferenz in einer Abfrage verwendet. Wenn es mehrere Indizes verwenden kann und tut, wäre es wahrscheinlich schneller, einen kombinierten Index zu verwenden Index falls vorhanden.
Wenn Sie beispielsweise eine große Tabelle nach Zeilen durchsuchen, ist
WHERE AnIntegerColumn = 42 AND AnOtherInt = 69
der schnellste Weg zu diesen Zeilen ein Index für die beiden Spalten AnIntegerColumn und AnOtherInt. Wenn Sie nur einen Index für jeden einzelnen, aber keinen kombinierten Index haben, durchsucht die DB entweder den einen oder den anderen Index und filtert die Ergebnisse separat mit der zweiten Klausel oder scannt beide und heiratet die Ergebnisse anschließend.Eine weitere übliche einfache Operation, die mit zusammengesetzten Indizes verbessert werden kann, ist
WHERE SomeColumn = <SomeValue> ORDER BY SomeOtherColumn
: Wenn für SomeColumn und SomeOtherColumn ein Index vorhanden ist (in der richtigen Reihenfolge), können die Filter- und Ordnungsoperationen unter bestimmten Umständen gleichzeitig ausgeführt werden.Das Hinzufügen zu vieler Indizes kann natürlich eine schlechte Optimierung sein, da der zusätzliche Speicherplatz zum Speichern der Indizes (und die E / A-Last, um sie zu verwalten, wenn Ihre DB viele Schreibvorgänge sieht) möglicherweise ein schlimmeres Problem darstellt als die etwas weniger optimalen Leseabfragen Also übertreib es nicht.
quelle
David und Randy haben dies abgedeckt. Ich wollte nur hinzufügen, dass der
EXPLAIN
Befehl eine große Hilfe sein kann, um herauszufinden, wann Sie große Einsparungen beim Erstellen eines Index erzielen und welche Indizes benötigt werden. Es werden die Schritte angezeigt, die die Datenbank ausführt, um Ihre Abfrage auszuführen, damit Sie wissen, welche Bits die längste Zeit in Anspruch nehmen.quelle
Was ich hier noch nicht erwähnt habe, ist, dass Sie, wenn Sie mehr als eine Festplatte haben, Ihren Index wahrscheinlich auf einer anderen Festplatte ablegen möchten, als dort, wo sich die Daten tatsächlich befinden. Dies kann einige Vorgänge beschleunigen. Ich denke, das verdient eine eigene Frage.
quelle