UNIQUE und PRIMARY KEY sind Einschränkungen , keine Indizes. Obwohl die meisten Datenbanken diese Einschränkungen implementieren, indem sie einen Index verwenden. Der zusätzliche Aufwand der Einschränkung zusätzlich zum Index ist unbedeutend, insbesondere wenn Sie die Kosten für das Aufspüren und Korrigieren unbeabsichtigter Duplikate zählen, wenn (nicht wenn) sie auftreten.
Indizes sind normalerweise effektiver, wenn Sie dort eine hohe Selektivität haben . Dies ist das Verhältnis der Anzahl unterschiedlicher Werte zur Gesamtzahl der Zeilen.
Beispielsweise können Sie in einer Spalte für die Sozialversicherungsnummer 1 Million Zeilen mit 1 Million unterschiedlichen Werten haben. Die Selektivität ist also 1000000/1000000 =1,0 (obwohl es seltene historische Ausnahmen gibt, sollen SSNs eindeutig sein).
Aber eine andere Spalte in dieser Tabelle, "Geschlecht", kann nur zwei unterschiedliche Werte über 1 Million Zeilen haben. 2/1000000 =sehr geringe Selektivität.
Ein Index mit einer UNIQUE- oder PRIMARY KEY-Einschränkung hat garantiert eine Selektivität von 1,0, sodass er immer so effektiv ist, wie ein Index nur sein kann.
Sie haben nach dem Unterschied zwischen einem Primärschlüssel und einer eindeutigen Einschränkung gefragt. Hauptsächlich können Sie nur eine Primärschlüssel-Einschränkung pro Tabelle haben (selbst wenn die Definition dieser Einschränkung mehrere Spalten enthält), während Sie mehrere eindeutige Einschränkungen haben können. Eine Spalte mit einer Unique-Einschränkung darf NULLen zulassen, wohingegen Spalten in Primärschlüssel-Einschränkungen keine NULLen zulassen dürfen. Ansonsten sind Primary Key und Unique sehr ähnlich in ihrer Implementierung und ihrer Verwendung.
Sie haben in einem Kommentar gefragt, ob Sie MyISAM oder InnoDB verwenden sollen. In MySQL verwenden sie den Begriff Speicher-Engine . Es gibt eine Menge subtiler Unterschiede zwischen diesen beiden Speicher-Engines, aber die wichtigsten sind:
- InnoDB unterstützt Transaktionen, sodass Sie Änderungen rückgängig machen oder festschreiben können. MyISAM ist praktisch immer autocommit.
- InnoDB erzwingt Fremdschlüsselbeschränkungen. MyISAM erzwingt oder speichert Fremdschlüsselbeschränkungen nicht.
Wenn Sie diese Funktionen in Ihrer Anwendung benötigen, sollten Sie InnoDB verwenden.
Auf Ihren Kommentar zu antworten, ist nicht so einfach. InnoDB ist tatsächlich in einigen Fällen schneller als MyISAM, also hängt es von der Mischung Ihrer Anwendung aus Auswahlen, Aktualisierungen, gleichzeitigen Abfragen, Indizes, Pufferkonfiguration usw. ab.
Siehe http:/ /www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/ für einen sehr gründlichen Leistungsvergleich der Speicher-Engines. InnoDB gewinnt oft genug gegen MyISAM, dass es eindeutig nicht möglich ist zu sagen, dass einer schneller als der andere ist.
Wie bei den meisten leistungsbezogenen Fragen ist die einzige Möglichkeit, sie für Ihre Bewerbung zu beantworten besteht darin, beide Konfigurationen mit Ihrer Anwendung und einer repräsentativen Datenstichprobe zu testen und die Ergebnisse zu messen.