Funktioniert ein mehrspaltiger Index auch für einzelne Spaltenauswahlen?
Habe ich (zum Beispiel) index:
CREATE INDEX someIndex ON orders (customer, date);
Macht diese index nur beschleunigen Abfragen, wo Kunde und Datum verwendet werden oder tut es das beschleunigen von Abfragen für eine einzelne Spalte, wie dies auch?
SELECT * FROM orders WHERE customer > 33;
Ich bin mit SQLite.
Wenn die Antwort ja ist, warum ist es möglich mehr als einen index pro Tabelle?
Noch eine andere Frage: Wie viel schneller ist ein kombinierter index im Vergleich mit zwei einzelnen Indizes, wenn du beide Spalten in einer Abfrage?
InformationsquelleAutor der Frage Georg Schölly | 2009-04-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
marc_s hat die richtige Antwort auf Ihre erste Frage. Der erste Schlüssel in einem multi-key-index arbeiten können, genau wie ein single-key-index, aber alle nachfolgenden Schlüssel nicht.
Als für wie viel schneller der composite-index ist, hängt von Ihren Daten und wie Sie die Struktur Ihrer index-und query, aber es ist in der Regel signifikant. Die Indizes im wesentlichen erlauben Sqlite zu tun, eine binäre Suche auf den Feldern.
Verwenden das Beispiel, das Sie Gaben, wenn Sie ausführen der Abfrage:
Sqlite würde zuerst bekommen alle Ergebnisse, die mit Hilfe einer binären Suche auf dem gesamten Tisch, wo die Kunden > 33. Dann würde es tun, eine binäre Suche auf nur die Ergebnisse der Suche nach " Datum > 99.
Wenn Sie Tat das gleiche query mit zwei separaten Indizes für Kunden und Datum, Sqlite müsste binäre Suche in der ganzen Tabelle zweimal, zuerst für den Kunden und einmal für das Datum.
Also, wie viel von einer Erhöhung der Geschwindigkeit, die Sie sehen, hängt davon ab, wie Sie die Struktur Ihres index mit Bezug auf Ihre Anfrage. Im Idealfall ist das erste Feld im index und die Abfrage sollte derjenige, der beseitigt die meisten möglichen übereinstimmungen zu geben, der die größte Geschwindigkeit zu erhöhen, durch die Reduzierung der Menge an Arbeit, die der zweiten Suche zu tun hat.
Weitere Informationen finden Sie unter:
http://www.sqlite.org/optoverview.html
InformationsquelleAutor der Antwort Jared Miller
Ich bin mir ziemlich sicher, das wird funktionieren, ja - das tut es in MS SQL-Server sowieso.
Allerdings ist dieser index nicht helfen, wenn Sie müssen Sie einfach nur auf das Datum, z.B. auf einen Datumsbereich. In diesem Fall müssen Sie möglicherweise erstellen Sie eine zweite index nur auf das Datum, um Abfragen effizienter.
Marc
InformationsquelleAutor der Antwort marc_s
Ich verwenden Häufig kombiniert Indizes zu Sortieren durch Daten, die ich Wünsche, um zu paginieren oder Anfrage "streamily".
Vorausgesetzt, kann ein Kunde mehr als eine Bestellung.. und Kunden von 0 bis 11 bestehen und es werden mehrere Aufträge pro Kunde alle eingefügt in zufälliger Reihenfolge. Ich möchte eine Abfrage Sortieren basierend auf Kunden-Nummer, gefolgt von dem Datum. Sie Sortieren sollte das id-Feld als auch letzten split sets, bei denen ein Kunde mehrere identische Datumsangaben (auch wenn das nie passieren kann).
Bekommen Seite 1 von einer Abfrage sortiert werden (begrenzt auf 10 items):
Holen Sie auf der nächsten Seite:
Und so weiter...
Nachdem die Indizes im Ort reduziert die server-Seite, index-scan, wenn Sie sonst eine Abfrage verwenden, OFFSET, gepaart mit einem LIMIT. Die Abfrage mal länger wird, und die Laufwerke suchen schwieriger, je höher die Einpresstiefe geht. Mit dieser Methode beseitigt.
Verwendung dieser Methode wird empfohlen, wenn Sie planen, auf den Beitritt zur Daten später benötigen aber nur eine begrenzte Menge von Daten pro Anfrage. Join gegen einer untergeordneten select-Anweisung, wie oben beschrieben, zu reduzieren Speicher-overhead für große Tabellen.
InformationsquelleAutor der Antwort whardier