dedlfix: MySQL: Existenz eines Datensatzes prüfen

Beitrag lesen

Tach!

Verstehe ich Dich richtig? Wenn ich mit phpMyAdmin eine Tabelle erstelle und dort bei einer Spalte 'Index' oder 'Unique' aktiviere, dann liefert mir das Durchstöbern der Spalte mit einem SELECT oder SELECT COUNT ein _schnelleres_ Ergebnis? Oder hab ich das falsch verstanden?

Normalerweise ist das die Aufgabe eines Index. Der Unique-Index hat zudem die Aufgabe, für Eindeutigkeit zu sorgen.

Der Index ist ja eine sortierte Menge, weswegen Zugriffe darauf sehr schnell ausgeführt werden können. Mitunter kann das Ergebnis einer Abfrage gar rein unter der Verwendung eines Index ermittelt werden. Ein COUNT() muss nicht die gesamte Tabelle durchsuchen, wenn laut Index kein weiterer Datensatz mehr gefunden werden kann. Beim Unique-Index wird es sogar noch deutlicher, dass es genau einen Datensatz gibt oder keinen. COUNT() kann also genauso gleich abbrechen wie ein EXISTS in einer unsortierten Menge. EXISTS ohne Index muss aber zumindest von vorn an jeden Datensatz absuchen, bis es einen passenden gefunden hat. Mit dem Index dürften sich beide Abfragen zeitlich nicht mehr viel nehmen. COUNT() kann lediglich dann deutlich langsamer sein, wenn eine sehr große Menge mit demselben Wert zu zählen wäre, aber dann ist vielleicht auch der Index wenig hilfreich.

All das sind nur theoretische Betrachtungen gepaar mit etwas Erfahrung. Der Optimizer in MySQL kann zur Abarbeitung einer Abfrage auch eine ganz andere eigene Meinung haben. Einen vorhanden Index zu verwenden lohnt sich zum Beispiel nicht, wenn nur drei Datensätze in der Tabelle sind. Da ist ein Full-Table-Scan auch nicht langsamer. Du kannst mit vorangestelltem EXPLAIN ergründen, was MySQL bei einer Query so zu tun gedenkt. Die Antwort ist aber auch stark vom Datenbestand abhängig und sie wird bei drei Datensätzen anders ausfallen als bei drei Millionen. Eine EXPLAIN-Betrachtung kann also nicht unbedingt verallgemeinert werden und sollte immer unter realistischen Bedingungen stattfinden, nicht nur mit einem sehr kleinen Testdatenbestand.

dedlfix.