it-swarm.com.de

Welche Spalten sind im Allgemeinen gute Indizes?

Im Anschluss an " Was sind Indizes und wie kann ich sie verwenden, um Abfragen in meiner Datenbank zu optimieren? ", wo ich versuche, mehr über Indizes zu erfahren, sind welche Spalten gute Indexkandidaten? Speziell für eine MS SQL Datenbank?

Nach einigem googeln deutet alles, was ich gelesen habe, darauf hin, dass Spalten, die im Allgemeinen ansteigen und eindeutig sind, einen guten Index ergeben (z. B. auto_increment von MySQL). Ich verstehe das, verwende aber MS SQL und GUIDs für Primärschlüssel, so scheint es diese Indizes würden nicht profitieren GUID Spalten ...

85
mmattax

Indizes können eine wichtige Rolle bei der Abfrageoptimierung und der schnellen Suche nach Ergebnissen aus Tabellen spielen. Daher ist es am wichtigsten, auszuwählen, welche Spalten indiziert werden sollen. Es gibt zwei Hauptbereiche, in denen die Indizierung in Betracht gezogen werden kann: Spalten, auf die in der WHERE-Klausel verwiesen wird, und Spalten, die in JOIN-Klauseln verwendet werden. Kurz gesagt, sollten solche Spalten indiziert werden, anhand derer Sie bestimmte Datensätze durchsuchen müssen. Angenommen, wir haben eine Tabelle mit dem Namen buyers, in der die SELECT-Abfrage Indizes wie die folgenden verwendet:

SELECT
 buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal'   /* consider to use index */

Da im SELECT-Teil auf "buyer_id" verwiesen wird, wird MySQL diese nicht verwenden, um die ausgewählten Zeilen einzuschränken. Daher besteht keine große Notwendigkeit, es zu indizieren. Das folgende Beispiel unterscheidet sich geringfügig von dem obigen:

SELECT
 buyers.buyer_id, /* no need to index */
 country.name    /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
 first_name='Tariq' /* consider to use index */
AND
 last_name='Iqbal' /* consider to use index */

Gemäß den obigen Abfragen first_name können last_name-Spalten indiziert werden, da sie in der WHERE-Klausel enthalten sind. Außerdem kann ein zusätzliches Feld country_id aus der Ländertabelle für die Indizierung in Betracht gezogen werden, da es sich in einer JOIN-Klausel befindet. Somit kann die Indizierung für jedes Feld in der WHERE-Klausel oder einer JOIN-Klausel berücksichtigt werden.

Die folgende Liste enthält auch einige Tipps, die Sie beim Erstellen von Indizes in Ihren Tabellen immer beachten sollten:

  • Indizieren Sie nur die Spalten, die in den WHERE- und ORDER BY-Klauseln erforderlich sind. Das häufige Indizieren von Spalten führt zu einigen Nachteilen.
  • Versuchen Sie, die "Index-Präfix" - oder "Mehrspalten-Index" -Funktion von MySQL zu nutzen. Wenn Sie einen Index wie INDEX (Vorname, Nachname) erstellen, erstellen Sie keinen INDEX (Vorname). "Indexpräfix" oder "Mehrspaltenindex" wird jedoch nicht in allen Suchfällen empfohlen.
  • Verwenden Sie das NOT NULL-Attribut für die Spalten, in denen Sie die Indizierung berücksichtigen, damit NULL-Werte niemals gespeichert werden.
  • Verwenden Sie die Option --log-long-format, um Abfragen zu protokollieren, die keine Indizes verwenden. Auf diese Weise können Sie diese Protokolldatei untersuchen und Ihre Abfragen entsprechend anpassen.
  • Mit der EXPLAIN-Anweisung können Sie feststellen, wie MySQL eine Abfrage ausführt. Es zeigt, wie und in welcher Reihenfolge Tabellen verknüpft werden. Dies kann hilfreich sein, um zu bestimmen, wie optimierte Abfragen geschrieben werden und ob die Spalten indiziert werden müssen.

pdate (23.02.15):

Jeder Index (gut/schlecht) erhöht die Einfüge- und Aktualisierungszeit.

Abhängig von Ihren Indizes (Anzahl der Indizes und Typ) wird das Ergebnis durchsucht. Wenn sich Ihre Suchzeit aufgrund des Index erhöht, ist der Index schlecht.

Wie in jedem Buch könnte "Indexseite" eine Kapitelstartseite, eine Themenseitennummer und eine Unterthemenseite enthalten. Eine Klarstellung auf der Indexseite hilft, aber ein ausführlicherer Index kann Sie verwirren oder erschrecken. Indizes haben auch Speicher.

Die Indexauswahl sollte klug sein. Beachten Sie, dass nicht alle Spalten einen Index benötigen.

90
Somnath Muluk

Einige Leute haben hier eine ähnliche Frage beantwortet: Woher weißt du, was ein guter Index ist?

Grundsätzlich hängt es wirklich davon ab, wie Sie Ihre Daten abfragen. Sie möchten einen Index, der schnell eine kleine Teilmenge Ihres Datasets identifiziert, die für eine Abfrage relevant ist. Wenn Sie nie nach Datumsstempel abfragen, benötigen Sie keinen Index, auch wenn dieser größtenteils eindeutig ist. Wenn Sie nur Ereignisse abrufen, die in einem bestimmten Zeitraum stattgefunden haben, möchten Sie auf jeden Fall eines. In den meisten Fällen ist ein Index zum Geschlecht sinnlos. Wenn Sie jedoch lediglich Statistiken zu allen Männern und separat zu allen Frauen abrufen, lohnt es sich möglicherweise, einen Index zu erstellen. Finden Sie heraus, wie Ihre Abfragemuster aussehen und welcher Parameter den Suchraum am meisten einschränkt, und das ist Ihr bester Index.

Berücksichtigen Sie auch die Art des Indexes, den Sie erstellen - B-Bäume sind für die meisten Dinge gut und erlauben Bereichsabfragen, aber Hash-Indizes bringen Sie direkt zum Punkt (erlauben jedoch keine Bereiche). Andere Arten von Indizes haben andere Vor- und Nachteile.

Viel Glück!

18
SquareCog

Es hängt alles davon ab, welche Fragen Sie zu den Tabellen stellen. Wenn Sie nach allen Zeilen mit einem bestimmten Wert für Spalte X fragen, müssen Sie eine vollständige Tabellensuche durchführen, wenn ein Index nicht verwendet werden kann.

Indizes sind nützlich, wenn:

  • Die Spalte oder Spalten weisen einen hohen Grad an Eindeutigkeit auf
  • Sie müssen häufig nach einem bestimmten Wert oder Wertebereich für die Spalte suchen.

Sie werden nicht nützlich sein, wenn:

  • Sie wählen einen großen Prozentsatz (> 10-20%) der Zeilen in der Tabelle aus
  • Die zusätzliche Speichernutzung ist ein Problem
  • Sie möchten die Insert-Leistung maximieren. Jeder Index für eine Tabelle verringert die Leistung beim Einfügen und Aktualisieren, da sie jedes Mal aktualisiert werden müssen, wenn sich die Daten ändern.

Primärschlüsselspalten eignen sich in der Regel hervorragend für die Indizierung, da sie eindeutig sind und häufig zum Nachschlagen von Zeilen verwendet werden.

6
Plasmer

Im Allgemeinen (ich verwende mssql nicht, kann also nicht spezifisch kommentieren) machen Primärschlüssel gute Indizes. Sie sind eindeutig und müssen einen bestimmten Wert haben. (Primärschlüssel erstellen außerdem so gute Indizes, dass normalerweise ein Index automatisch erstellt wird.)

Ein Index ist quasi eine Kopie der Spalte, die sortiert wurde, um eine binäre Suche zu ermöglichen (die viel schneller ist als eine lineare Suche). Datenbanksysteme können verschiedene Tricks anwenden, um die Suche noch weiter zu beschleunigen, insbesondere wenn die Daten komplexer als eine einfache Zahl sind.

Mein Vorschlag wäre, zunächst keine Indizes zu verwenden und Ihre Abfragen zu profilieren. Wenn eine bestimmte Abfrage (z. B. die Suche nach Personen nach Nachnamen) sehr häufig ausgeführt wird, versuchen Sie erneut, einen Index für die relevanten Attribute und Profile zu erstellen. Wenn bei Abfragen eine spürbare Beschleunigung und bei Einfügungen und Aktualisierungen eine geringfügige Verlangsamung zu verzeichnen ist, behalten Sie den Index bei.

(Entschuldigung, wenn ich die in Ihrer anderen Frage erwähnten Dinge wiederhole, bin ich vorher nicht darauf gestoßen.)

5
Zooba

Jede Spalte, die regelmäßig zum Extrahieren von Daten aus der Tabelle verwendet wird, sollte indiziert werden.

Dies beinhaltet: Fremdschlüssel -

select * from tblOrder where status_id=:v_outstanding

beschreibende Felder -

select * from tblCust where Surname like "O'Brian%"

Die Spalten müssen nicht eindeutig sein. Tatsächlich kann ein Binärindex bei der Suche nach Ausnahmen eine wirklich gute Leistung bringen.

select * from tblOrder where paidYN='N'
4
pappes

Eine GUID Spalte ist nicht der beste Kandidat für die Indizierung. Indizes eignen sich am besten für Spalten mit einem Datentyp, dem eine sinnvolle Reihenfolge zugewiesen werden kann, dh sortiert (Ganzzahl, Datum usw.).

Es spielt keine Rolle, ob die Daten in einer Spalte im Allgemeinen zunehmen. Wenn Sie einen Index für die Spalte erstellen, erstellt der Index eine eigene Datenstruktur, die einfach auf die tatsächlichen Elemente in Ihrer Tabelle verweist, ohne auf die gespeicherte Reihenfolge Rücksicht zu nehmen (ein nicht gruppierter Index). Dann kann zum Beispiel eine binäre Suche über Ihre Indexdatenstruktur durchgeführt werden, um einen schnellen Abruf zu ermöglichen.

Es ist auch möglich, einen "Clustered Index" zu erstellen, der Ihre Daten physisch neu anordnet. Sie können jedoch nur einen dieser Indizes pro Tabelle haben, wohingegen Sie mehrere nicht gruppierte Indizes haben können.

3
Ash

Es hängt wirklich von Ihren Fragen ab. Wenn Sie beispielsweise fast nur in eine Tabelle schreiben, ist es am besten, keine Indizes zu haben. Sie verlangsamen nur die Schreibvorgänge und werden nie verwendet. Jede Spalte, die Sie zum Verknüpfen mit einer anderen Tabelle verwenden, ist ein guter Kandidat für einen Index.

Lesen Sie auch die Funktion "Fehlende Indizes". Es überwacht die tatsächlichen Abfragen, die für Ihre Datenbank verwendet werden, und kann Ihnen mitteilen, welche Indizes die Leistung verbessert hätten.

3
jwanagel

Ihr Primärschlüssel sollte immer ein Index sein. (Es würde mich wundern, wenn es tatsächlich nicht automatisch von MS SQL indiziert würde.) Sie sollten auch die Spalten, die Sie SELECT oder ORDER häufig indizieren; Ihr Zweck ist sowohl die schnelle Suche nach einem einzelnen Wert als auch das schnellere Sortieren.

Die einzige wirkliche Gefahr beim Indizieren von too vielen Spalten besteht darin, Änderungen an Zeilen in großen Tabellen zu verlangsamen, da alle Indizes ebenfalls aktualisiert werden müssen. Wenn Sie sich nicht sicher sind, was Sie indizieren sollen, messen Sie einfach Ihre langsamsten Abfragen, sehen Sie sich an, welche Spalten am häufigsten verwendet werden, und indizieren Sie sie. Dann sehen Sie, wie viel schneller sie sind.

1
Eevee

Numerische Datentypen, die in aufsteigender oder absteigender Reihenfolge angeordnet sind, sind aus mehreren Gründen gute Indizes. Erstens können Zahlen im Allgemeinen schneller ausgewertet werden als Zeichenfolgen (varchar, char, nvarchar usw.). Zweitens, wenn Ihre Werte nicht sortiert sind, müssen möglicherweise Zeilen und/oder Seiten gemischt werden, um Ihren Index zu aktualisieren. Das ist zusätzlicher Aufwand.

Wenn Sie SQL Server 2005 verwenden und die Verwendung von eindeutigen Bezeichnern (Guids) aktivieren und diese NICHT zufällig sein müssen, überprüfen Sie den sequenziellen eindeutigen Bezeichnertyp.

Wenn Sie schließlich über Clustered-Indizes sprechen, sprechen Sie über die Art der physischen Daten. Wenn Sie eine Zeichenfolge als Clustered-Index haben, kann dies hässlich werden.

1
Ian Suttle

Es sollte noch schneller sein, wenn Sie eine GUID verwenden. Angenommen, Sie haben die Aufzeichnungen

  1. 100
  2. 200
  3. 3000
  4. ....

Wenn Sie über einen Index verfügen (binäre Suche), können Sie den physischen Speicherort des gesuchten Datensatzes in O (lg n) -Zeit ermitteln, anstatt nacheinander nach O(n) Zeit zu suchen liegt daran, dass Sie nicht wissen, welche Datensätze Sie in Ihrer Tabelle haben.

0
Milhous

Die alte Faustregel lautete: Spalten, die häufig in WHERE-, ORDER BY- und GROUP BY-Klauseln verwendet werden, oder solche, die anscheinend häufig in Joins verwendet werden. Denken Sie daran, ich beziehe mich auf Indizes, NICHT auf Primärschlüssel

Keine 'Vanilla-ish'-Antwort, aber es hängt wirklich davon ab, wie Sie auf die Daten zugreifen

0
curtisk

Der beste Index hängt vom Inhalt der Tabelle und dem ab, was Sie erreichen möchten.

Ein Beispiel nehmen Eine Mitgliedsdatenbank mit einem Primärschlüssel der Mitglieds-Sozialversicherungsnummer. Wir wählen S.S., weil sich das Anwendungsprogramm auf diese Weise auf die Person bezieht, Sie aber auch eine Suchfunktion erstellen möchten, die den Vor- und Nachnamen der Mitglieder verwendet. Ich würde dann vorschlagen, einen Index für diese beiden Felder zu erstellen.

Sie sollten zuerst herausfinden, welche Daten abgefragt werden, und dann bestimmen, welche Daten indiziert werden müssen.

0
Joseph