Michael Schröpl: MySQL: Performaceproblem

Beitrag lesen

Hi Rol,

ich habe in einer MySQL DB eine Tabelle mit ca. 1,4 Mio Datensätzen
und prinzipiell folgendem Aufbau:
SELECT sp2, sp3 FROM tabelle WHERE Sp1='bbbbb';

Wie viele _verschiedene_ Werte enthält die Spalte "sp1"?
(Wie viele Treffer bekommst Du im Schnitt?)

Wenn das wenige sind (1-3stellig), dann fehlt einfach nur der Index.
(Mit dem wird es dann um 3-5 Zehnerpotenzen schneller.)

dauert auf meinem PC (PIII, 650 Mhz) ca. 7 Sekunden, was entschieden
zu lange ist.

Das riecht nach einem full table scan, also keinem verwendeten Index.

Bei o.g. Select-Abfrage wird doch jede Zeile von Sp1 geprüft.

Genau das solltest Du ändern.

Diese Spalte ist aber vorsortiert,

Das bezweifele ich.
Du hast keinen Einfluß auf die interne Anordnung der Datensätze.

so dass doch nach dem ersten Auftauchen eines anderen Wertes
(nach min. einem erfolgreichem matching) die Suche abgebrochen
werden könnte.

Nein, kann sie nicht.
Deine Anfrage verlangt _alle_ Treffer, nicht nur den ersten.

Geht so was oder bin ich etwas ganz auf dem Holzweg?

Wenn Deine Treffer in der Tat unique sein sollten,
dann wäre ein Primärschlüssel über Spalte Sp1 zu empfehlen.

Im Ergebnis der Select-Abfrage muss ich dann noch mehrmals suchen.

Wieso? Du kannst mehrere WHERE-Klauseln kombinieren.

Wie kann ich mir dabei eine erneute, erste (siehe oben) Abfrage
ersparen?

Solltest Du nicht tun.
Mit Index wird die so schnell, daß Du dafür keinen Grund mehr hast.

Wenn ich das Ergebnis in eine anderen Tabelle schreibe um es
zwischenzuspeichern, bekomme ich Probleme, wenn mehrere Prozesse
zeitüberschneidend da sgleiche tun.

Temporäre Tabellen von mySQL sind prozeßlokal, da würdest Du das
Problem nicht haben. Aber das brauchst Du nicht - was Du brauchst,
ist ein guter Index über Deine Such-Spalte(n).
Eventuell ein Index über mehrere Spalten auf einmal - das kommt auf
Deine Suchanforderungen an ... und das wäre wesentlich _schneller_,
als im Ergebnis der ersten Suche wiederum einen full table scan zu
machen.

Viele Grüße
      Michael