Kann dir leider keine entsprechende Seite nennen, aber vielleicht hilft dir das für einen Einstieg:
Index: Ein Index wird auf eine oder mehrere Spalten einer Tabelle angewendet. Den entsprechenden Befehl kannst du in der Doku des DBMS nachlesen, er müsste so ungefähr lauten:
CREATE INDEX IndexName ON TabellenName(SpaltenListe)
Ein Index erzwingt in einer Datenbank, das alle Werte der indizierten Spalten einer Tabelle in einem internen Cache in sortierter Form (ist meist im Arbeitsspeicher) gehalten werden. Das führt dazu, das ein Zugriff auf die Tabelle mittels SELECT, INSERT, UPDATE, DELETE sehr sehr schnell erfolgen kann, weil das DBMS diese Daten für einen optimalen Zugriff bereit hält. Ganz im Gegenteil sind die Werte der nicht indizierten Spalten im schlimmsten Fall irgendwo auf einem langsamen Medium, z.B. der Festplatte, abgelegt. Das DBMS muss dann bei der Suche/beim Filtern der Datensätze entsprechend sehr teure (langsame) Zugriffe machen. Vergleich: Festplatte (Alle Daten der Tabelle) mit Arbeitsspeicher (indizierte Daten im Cache) hinsichtlich der Geschwindigkeit!
Unique Index: Ist eine besondere Form des Index, bei dem die Werte der indizierten Spalten einer Zeile jeweils eindeutig sind, d.h. es gibt keine 2. Zeile die genau die gleichen Werte hat.
PrimaryKey: Ist ein Schlüssel von einer Zeile. Aus praktischer Sicht ist das letztendlich nur eine Festlegung, das die Werte der Spalten in Ihrer Gesamtheit eindeutig für jede Zeile sind, d.h. es gibt keine 2 Datensätze, die die gleichen Werte der Spalten des PrimaryKeys haben. Ebenso fungieren Sie als der Schlüssel um eine Zeile eindeutig zu identifizieren. Diese Spalten des PrimaryKeys werden automatisch vom DBMS indiziert (s.o.). Für Abfragen oder Manipulation der Daten sollte man (wenn möglich) immer diese Spalten als Filterkriterien (in der WHERE Bedingung) verwenden um eine optimale Geschwindigkeit zu erreichen.
ForeignKey: Stellt die Beziehung zwischen 2 Tabellen her, d.h. die Spalten des ForeignKeys der Tabelle A sind mit Spalten der Tabelle B verknüpft. In der Regel ist der ForeignKey einer Tabelle auch der PrimaryKey der 2.Tabelle. ForeignKey Spalten werden nicht automatisch vom DBMS indiziert, sollten durch den Ersteller der Datenbank (du) stets mit einem Index versehen werden. Für Abfragen (insbesondere JOINS, SubSelects ... ) oder Manipulation der Daten sollte man möglichst die ForeignKeys Spalten als Filterkriterien in der WHERE Bedingung verwenden, wenn z.B. der PrimaryKey nicht eingesetzt werden kann.
Unique Keys: Kenne ich nicht und gibts die denn überhaupt?!?
Kurz gesagt, alles was im Cache einer Datenbank ist, kann sehr schnell sein, während alles andere u.U. viel Zeit braucht.
Ein Beispiel aus eigener Berufspraxis:
Die Datenbank eines meiner Kunden benötigte für einen miserablen UPDATE Befehl (keine indizierten Spalten in der WHERE Bedingung und Verwendung von Subselects!) bei 200000+ Datensätzen der Tabelle mehrere Minuten obwohl nur einige wenige Datensätze geändert wurden. Nach dem ich die betroffenen Tabellen mit den richtigen PrimaryKey, ForeignKeys und Indexen versehen hatte und die WHERE Bedingung so anpasste, das nur noch die indizierten Spalten verwendet wurden, wurde der UPDATE Befehl nach 1 Sekunde vollständig ausgeführt.
Hier noch ein paar kleine Tipps:
a) Verwende möglichst die gleiche Reihenfolge der Spalten in der Where-Bedingung, wie die Reihenfolge der Spalten des Index (der Optimizer des DBMS kann dies leichter erkennen und den Ausführungsplan, somit die Abfrage, optimieren)
b) meide Konstrukte ala " SpalteX LIKE '%XYZ%' " (führt meist zu einem sehr langsamen FULL TABLE SCAN)
c) Überprüfe den Ausführungsplan deines Sql-Befehls in einem Analyzer/Profiler (z.B. SqlAnalyzer).
Ausführung ala "INDEX SCAN" sind gut, andere wie "FULL TABLE SCAN" sind schlecht. Bei großen Tabellen auf jeden Fall, bei kleinen Tabellen auch schlecht aber meist nicht so sehr. siehe
MySql EXPLAIN für die Optimierung von Abfragen
Ich hoffe, das ich dir ein klein wenig helfen konnte. Wie gesagt, das ist nur eine grobe Zusammenfassung über dieses Thema und hat keinesfalls den Anspruch auf Vollständigkeit und 100% Richtigkeit! Für Verbesserungen können sich die Experten gerne zu Wort melden.
Grüße Rossibaer