SQL/PHP: Laufzeitenoptimierung

mayooo

Grünschnabel
Hallo liebe Gemeinde!

Ich habe mal wieder ein sehr diffuses Problem.
Vorgeschichte: Spezielle Abfrage zweier Tabellen

Nun, ich habe die Regionen in eine Extratabelle ausgegliedert und mittels einer Abfrage werden die Reisentabelle und die Regionstabelle abgefragt:
PHP:
$query = "SELECT r.region_id, r.reise_id, k.* 
          FROM region r, kreuzfahrt k
          WHERE k.start >= '".$start."' AND k.start <= '".$ende."'";

if($get_ziel) $quer_ziel 		= " AND r.region_id = '".$get_ziel."' AND r.reise_id = k.reise_id";
if($get_reed) $quer_reed 		= " AND k.reed_id = '".$get_reed."'";
if($get_schiff) $quer_schiff 	= " AND k.schiffs_id = '".$get_schiff."'";
			$query				.= $quer_ziel.$quer_reed.$quer_schiff. " GROUP BY k.reise_id ORDER BY k.start ASC

Ich denke mal, die genannten Felder im Code sind selbsterklärend.
Die Abfrage funktioniert soweit wirklich gut und zuverlässig, doch mit wachsender Datenbank (mehr Reedereien, Schiffe und somit Reisen / hier und da neue Regionen) lahmt diese Abfrage.

Meine Frage nun an euch: Wie kann ich das ganze beschleunigen? Abfragezeiten von biszu 59 Sekunden bei DSL sind einfach nicht tragbar!

Ich habe auch schon überlegt, wieder zurück zur alten Variante zu schreiten. Also die Regionen wieder in die Reisentabelle einzugliedern. (Alle jew. entsprechenden Regions-IDs in ein Feld des Datensatzes, getrennt mit Semikolon o.ä.) Diese würde ich dann irgendwie mittels explode auseinanderpflügen, weiß aber nicht ob dies dann wirklich schneller wird.:rolleyes:

Ich freu mich auf eure hoffentlich hilfreichen Antworten...

- Mayo.
 
Hallo,

1. Queryoptimierung: Ist es nötig "k.*" zu nehmen? Ein Select auf die Wildcard ist immer langsamer als die Felder direkt anzugeben, selbst wenn man alle Felder braucht. Prepared Statements wären auch noch einen Blick wert. (obwohl die bei MySQL den Query Cache unterlaufen,also mal mit Vorsicht genießen)

2. Datenbankoptimierung: Das Zauberwort heißt Indizes etc. Korrekt gesetzte Indizes wirken wahre Wunder, des Weiteren gibt es noch einen Query Cache etc. Außerdem bietet MySQL noch eine direkt Konfigurationsdatei speziell für große Tabellen an, da sollte man auch mal rein gucken. Dann ist die nächste Frage, welche Storage Engine du benutzt. Bei derartig großen Tabellen sollte man nicht mehr auf MyIsam setzen. Such einfach mal konkret nach der MySQL Tabellen Optimierung. Durch korrektes und gutes Datenbankdesign kann man einiges rausholen.

3. Hardware des Servers: Lahmt die Hardware vielleicht an einer Stelle? Tausch sie aus! Mehr RAM ist immer gut. Ist natürlich nicht immer notwendig, man kann schon mit Punkt 1 und Punkt 2 eine Menge machen.

ach so, ob du da mit DSL sitzt oder nicht, ist dem MySQL-Server ziemlich egal.
 
Zuletzt bearbeitet:
Vielen Dank!
Ich stecke grad mitten im Wust vom MySQL-Handbuch. :rtfm: usw ^^
Ich denke, dass ich mit den Prepare Statements ne Menge Effektivität zurück holen kann!

Ich kram mich mal weiter durchs Netz und bedanke mich hochachtungsvoll bei dir!

- Mayo.
 
Zurück