Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Welche Spalten ergeben im Allgemeinen gute Indizes?

Indizes können eine wichtige Rolle bei der Abfrageoptimierung und dem schnellen Durchsuchen der Ergebnisse aus Tabellen spielen. Daher ist es der wichtigste Schritt, auszuwählen, welche Spalten indiziert werden sollen. Es gibt zwei Hauptstellen, an denen wir die Indizierung in Betracht ziehen können: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 namens „Käufer“, in der die SELECT-Abfrage Indizes wie unten 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 auf „buyer_id“ im SELECT-Teil verwiesen wird, verwendet MySQL sie nicht, um die ausgewählten Zeilen einzuschränken. Daher besteht keine große Notwendigkeit, es zu indizieren. Das Folgende ist ein weiteres Beispiel, das sich geringfügig vom obigen unterscheidet:

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, last_name können Spalten indiziert werden, da sie sich in der WHERE-Klausel befinden. Auch ein zusätzliches Feld, country_id aus der Ländertabelle, kann für die Indexierung berücksichtigt werden, da es in einer JOIN-Klausel enthalten ist. Daher kann die Indizierung für jedes Feld in der WHERE-Klausel oder einer JOIN-Klausel in Betracht gezogen werden.

Die folgende Liste bietet auch einige Tipps, die Sie immer im Hinterkopf behalten sollten, wenn Sie beabsichtigen, Indizes in Ihren Tabellen zu erstellen:

  • Indizieren Sie nur die Spalten, die in WHERE- und ORDER BY-Klauseln erforderlich sind. Das Indizieren von Spalten im Überfluss führt zu einigen Nachteilen.
  • Versuchen Sie, die MySQL-Funktion "Index-Präfix" oder "Multi-Columns-Index" zu nutzen. Wenn Sie einen Index wie INDEX(first_name, last_name) erstellen, erstellen Sie INDEX(first_name) nicht. „Indexpräfix“ oder „mehrspaltiger Index“ wird jedoch nicht in allen Suchfällen empfohlen.
  • Verwenden Sie das Attribut NOT NULL für die Spalten, in denen Sie die Indizierung berücksichtigen, damit niemals NULL-Werte 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 überprüfen und Ihre Abfragen entsprechend anpassen.
  • Die EXPLAIN-Anweisung hilft Ihnen zu zeigen, wie MySQL eine Abfrage ausführt. Es zeigt, wie und in welcher Reihenfolge Tabellen verbunden werden. Dies kann sehr nützlich sein, um zu bestimmen, wie optimierte Abfragen geschrieben werden und ob die Spalten indiziert werden müssen.

Aktualisierung (23. Februar 2015):

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

Abhängig von Ihren Indizes (Anzahl der Indizes und Typ) wird nach Ergebnissen gesucht. Wenn Ihre Suchzeit aufgrund des Indexes länger wird, dann ist das ein schlechter Index.

Wahrscheinlich könnte die „Indexseite“ in jedem Buch eine Kapitelanfangsseite haben, die Themenseitenzahl beginnt, auch Unterthemenseiten beginnen. Etwas Klarstellung auf der Indexseite hilft, aber ein detaillierterer Index könnte Sie verwirren oder Ihnen Angst machen. Indizes haben auch Speicher.

Die Indexauswahl sollte klug sein. Denken Sie daran, dass nicht alle Spalten einen Index erfordern würden.