PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mySql Abfragen optimieren



ManuelW
29-12-2005, 12:57
Hiho, ich benutzt zZ für ein Projekt eine Abfrage, mit der ich aus anderen Tabellen per Left Join noch weitere Daten abrufe.



$result = mysql_query("SELECT a.num, a.adresse AS adresse_neu, a.bezeichnung AS bezeichnung_neu, a.text, DATE_FORMAT(a.zeit, '%Y%m%d%H%i%s') AS zeit, a.funktion, a.REC_TYP, a.done,
b.adresse, b.formatierung_id, b.bezeichnung,
d.id AS org_id, d.org_name, d.org, d.alarm_count, d.last_alarm
FROM dme a
LEFT JOIN ric_zvei b ON b.adresse = a.adresse
LEFT JOIN organisation d ON d.id = b.org_id
$show_filter
ORDER BY a.zeit DESC") or die (mysql_error());
while($row = mysql_fetch_array($result))
{


Nun die Frage, gibt es da elegantere Lösungen ?
Die Datenbank enthält mittlerweile um 200.000 Datensätze und die Abfragen dauern
schon etwas. Ich würd das ganze gern mal optimieren, habe aber keinen richtigen Ansatz dazu.

Auch glaube ich das die Abfrage nach Datum nicht unbedingt optimal ist, das doch
theoretisch alle Datensätze nach Datum geprüft werden müssen, oder sehe ich das falsch ?

Hoffe auf ein paar Tips, danke Manu :)

ninguno
29-12-2005, 13:14
wie schaut denn die where bedingung aus? und welche indexe sind vorhanden?

ManuelW
29-12-2005, 13:25
Die where Bedingung schaut im großen und ganzen so aus



WHERE a.zeit > '$datum' ";

wobei $datum aus verschiedenen Faktoren zusammen gebaut wird.
Also geschaut wird in der Spalte Datum nach allen Datie (?!) welche größer als das angegebene sind.

indexe sind keine vorhanden :/

ninguno
29-12-2005, 13:34
naja leg mal ein paar indexe für die wichtigen spalten (adressen, org_id, eventuell zeit) an und schau ob sich die performance verbessert

ManuelW
29-12-2005, 13:38
Alles klar, wer ich mal testen.

Ich such grad mal noch nach einer Beschreibung was die indexe überhaupt genau machen,
bzw wie mysql diese handhabt, hab mich ehrlich gesagt noch nicht weiter damit beschäftigt :/

ninguno
29-12-2005, 13:46
schau zb mal in der mysql doku nach unter Wie MySQL Indexe benutzt (http://dev.mysql.com/doc/refman/4.0/de/mysql-indexes.html)

ManuelW
29-12-2005, 14:03
hehe, danke, die hab ich mir grad schon durch gelesen :)

das war ein super tip, die ladezeit hat sich enorm verringert.

vieln dank, gruss manu

Turbohummel
30-12-2005, 07:19
mysql_query('SELECT a.num, a.adresse AS adresse_neu, a.bezeichnung AS bezeichnung_neu, a.text, DATE_FORMAT(a.zeit, '%Y%m%d%H%i%s') AS zeit, a.funktion, a.REC_TYP, a.done,
b.adresse, b.formatierung_id, b.bezeichnung,
d.id AS org_id, d.org_name, d.org, d.alarm_count, d.last_alarm
FROM dme a
LEFT JOIN ric_zvei b ON b.adresse = a.adresse
LEFT JOIN organisation d ON d.id = b.org_id
'.$show_filter.'
ORDER BY a.zeit DESC")

dürfte das ganze noch ein wenig mehr beschleunigen.