MySQL Query optimieren

TVE

Erfahrenes Mitglied
Guten Tag die Damen und Herren

Ich habe bei meinem jetztigen Webprojekt einen MySQL Query, welcher z.B. so aussehen könnte:

Code:
SELECT ka_name, pr_titel, pr_id, ka_id, pr_oefplz, pr_oefort, we_betrag, pr_maxang, COUNT( bi_id ) AS anzahl
FROM problem
LEFT JOIN bieter ON pr_id = bi_pridfs, kategorie, person, ort, bezirk, region, land, wert
WHERE ( ka_id LIKE '%' ) AND we_id = pr_weidfs AND ka_id = pr_kaidfs AND pe_id = pr_peidfs AND la_id = re_laidfs AND re_id = be_reidfs AND be_id = or_beidfs AND or_id = pe_oridfs AND la_id = '186' AND re_id
LIKE '%' AND be_id
LIKE '%' AND pr_aktiv = '1' AND (
(
bi_aktiv = '1' AND bi_status = '1'
) OR (
bi_aktiv IS NULL 
) OR (
bi_aktiv = '1' AND (
bi_status = '2' OR bi_status = '3'
)
)
) AND (
ka_name
LIKE '%schiff%' OR pr_titel
LIKE '%schiff%' OR pr_beschreibung
LIKE '%schiff%'
)
GROUP BY pr_id
HAVING anzahl < pr_maxang
ORDER BY ka_name, pr_titel ASC

Das ist auch alles schön und gut, nur dass die ganze Abfrage bei 10'000 Einträgen in der Tabelle 'problem' etwa die Zeit von 4 Sekunden benötigt um das Ergebnis auszuspucken. (das Ganze auf einem Single-Prozessor Webserver, bei Dual/Multi-Prozessor hab ich nicht getestet)

Gibt es eine Möglichkeit den Query besser zu schreiben, zu optimieren? Ist eventuell Indexierung ein Lösungsansatz für eine bessere Performance?

Als kleine Marke noch: Wenn ich ein stinknormales Query nur auf die Tabelle 'problem' durchführe braucht es bloss 2ms Zeit.

Zusätzliche Info:
MySQL 4.0.18
PHP 4.3.4
Apache 1.3.29

Ich danke für alle Ideen.
 
Ohne mir die Abfrage genauer angeschaut ( oder gar nachvollzogen) zu haben fällt mir folgendes Totschlagkriterium sofort auf

LIKE '%'

damit werden alle Zeilen einer Tabelle angegeben! Bei einer komplexen Verknüpfung sollte sowas allerdings vermieden werden!

Außerdem bin ich mir über die Klammerung nicht so ganz im Klaren.

Dieser Teil z.B.
OR ( bi_aktiv = '1' AND (bi_status = '2' OR bi_status = '3') )

wird evtl. von MySql gelesen als
bi_aktiv = ( '1' AND (...) )

ich würde sicherheitshalber Klammern um ( bi_aktiv = '1') setzen

Indexe sind natürlich von Vorteil, sofern sie bei der Abfrage verwendet werden können ( LIKE "%" würde bspw. auf die Verwendung eines Index verzichten, da eh alles betrachtet wird)

vop
 
Hallo vop

Danke für deine prompte Antwort.

Die LIKE in meiner Query brauche ich leider, da es sich um eine Suchabfrage handelt. Dabei will ich, dass der Suchtext (also der String zwischen den Platzhaltern) in den 3 angegebenen Feldern gesucht wird. Aber ich könnte mal was versuchen ohne die LIKE Statements.

Das Zeug mit dem Aktiv ist OK so. Die Klammern stimmen eigentlich. (rein vom Suchergebnis abgeleitet, das ich jetzt hier nicht gepostet habe)

Ich hab vorhin gerade meinen Server ins Nirvana geschickt, als ich noch schnell mal 100'000 Einträge in die Tabelle 'bieter' eingetragen hab. Das Ergebnis nach der Abfrage war nicht mehr anzuzeigen. (Server war etwa ne Stunde lang nicht ansprechbar)

Wie machen das eigentlich solche Firmen wie Ebay oder Amazon? Die müssen ja Millionen von Datensätzen verwalten und nur bessere Hardware kanns doch nicht sein? Ist eventuell meine DB zu stark normalisiert?

Bitte um weiteren Input.
 
Zurück