Datenbank-Indizes und Ihre Big-O-notation
Ich versuche zu verstehen, die Leistung von Datenbank-Indizes in Bezug auf die Groß-O-notation. Ohne zu wissen viel über es, ich würde vermuten, dass:
- Abfragen in einer primary key-oder unique-index geben Sie einen O(1) lookup-Zeit.
- Abfragen auf einen nicht eindeutigen index wird auch geben, ein O(1) Zeit, wenn auch vielleicht die '1' ist langsamer als bei der eindeutigen index (?)
- Abfrage auf eine Spalte ohne index geben Sie einen O(N) - lookup-Zeit (full table scan).
Ist diese Regel richtig ? Wird die Abfrage auf einen Primärschlüssel je geben schlechtere Leistung als O(1) ? Mein besonderes Anliegen ist für SQLite, aber ich wäre daran interessiert zu wissen, inwieweit diese variiert zwischen verschiedenen Datenbanken zu.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meisten relationalen Datenbanken Struktur Indizes B-Bäume.
Wenn eine Tabelle über eine clustering-index die Datenseiten gespeichert werden, die Blattknoten des B-Baumes. Im wesentlichen werden die clustering-index wird die Tabelle.
Für die Tabellen w/o-clustering-index die Datenseiten der Tabelle gespeichert sind, die in einem heap. Alle nicht gruppierten Indizes B-Bäume, wo die Blattknoten des B-Baums identifiziert eine bestimmte Seite in den Haufen.
Schlimmsten Fall die Höhe des B-Baums ist O(log n) und da es eine Suche ist abhängig von der Höhe, der B-Baum-lookups ausführen, in so etwas wie (im Durchschnitt)
O(logt n)
wo t ist die Minimierung Faktor ( jeder Knoten muss mindestens t-1 Tasten und bei den meisten 2*t* -1 Schlüssel (z.B. 2*t* Kinder).
Das ist so, wie ich es verstehe.
Und unterschiedliche Datenbank-Systeme, aber natürlich auch mit verschiedenen Daten-Strukturen unter der Haube.
Und wenn die Abfrage keinen index, der Kurs, dann die Suche ist eine iteration über den heap oder B-Struktur enthält die Daten, die Seiten.
Durchsuchungen sind ein wenig billiger, wenn der index verwendet werden kann, die der Anfrage genügen, da andernfalls ein lookaside zu Holen, die entsprechende Datenseite im Speicher erforderlich ist.
Die indizierte Abfragen (eindeutig oder nicht) sind in der Regel eher O(log n). Sehr vereinfachend kann man denken, dass es ähnlich ist, um eine binäre Suche in einem sortierten array. Genauer gesagt, es hängt davon ab, auf die index-Typ. Aber ein b-tree-Suche, zum Beispiel, ist immer noch O(log n).
Wenn kein index vorhanden ist, dann, ja, es ist O(N).
Wenn Sie die gleichen Spalten, die Sie suchen, dann
Wenn Sie Informationen aus einer anderen "Quelle" (index-Kreuzung, Lesezeichen/key lookup etc), weil der index nicht abdeckt, dann hätte man O(n + log n) oder O(log n + log n + log n), weil der Multi-index trifft + intermediate Sortieren.
Wenn Statistiken zeigen, dass Sie erfordern eine hohe % der Zeilen (zB nicht sehr selektiv index), dann wird der index ignoriert werden kann und ein scan = O(n)
Andere Antworten geben einen guten Anhaltspunkt, aber ich würde nur hinzufügen, dass man O(1), primärem index selbst werden müssten, hash-basierte (was normalerweise nicht das default-Wahl); so häufiger wird es logarithmisch (B-Baum).
Sind Sie richtig, sekundäre Indizes haben in der Regel gleiche Komplexität, aber viel schlimmer ist, die tatsächliche Leistung-dies, weil der index und die Daten werden nicht gruppiert, so dass die Konstante (Anzahl der Suchvorgänge auf der Festplatte), ist größer.
Es hängt davon ab, was Ihre Abfrage.
Column = Value
ermöglicht die Verwendung einer hash-basierten index, die O(1) lookup-Zeit. Allerdings viele Datenbanken wie SQLite, nicht unterstützt werden.<
,>
,<=
,>=
) Gebrauch machen können, eine geordnete index, in der Regel umgesetzt mit einem binären Baum, der in O(log n) - lookup-Zeit.Da Sie in Erster Linie daran interessiert, SQLite, möchten Sie vielleicht zu Lesen sein Query Optimizer-Übersicht, die ausführlich erklärt, wie Indizes ausgewählt werden.