MySQL Anfrage optimieren mit JOIN

Parantatatam

mag Cookies & Kekse
Hallo,

ich habe gerade überlegt, ob meine MySQL-Anfrage, welche so wie sie ist problemlos funktioniert, nicht in irgendeiner Weise optimiert werden könnte. Da mein Datenbanksystem später mit größeren Datenmenge umgehen muss und auch eine Menge Tabellen beinhaltet. So sieht meine Abfrage im Moment aus. Vielleicht kann man das mit JOINs verbessern?
PHP:
<?php
/****************************************************************************************************/
// MySQL Anfrage
$sql =
 'SELECT
   `dat_schedule`.`day`    AS `day`,
   `dat_schedule`.`lesson` AS `lesson`,
   `dat_schedule`.`id`     AS `id`,
   `dat_subject`.`short`   AS `subject`,
   `dat_room`.`number`     AS `room`,
   `dat_teacher`.`short`   AS `teacher`,
   `dat_course`.`term`     AS `course`
  FROM
   `dat_course`,
   `dat_schedule`,
   `dat_subject`,
   `dat_room`,
   `dat_teacher`,
   `rel_schedule_course`
  WHERE `dat_course`.`term`               = "'.iTrim($term).'"
  AND   `rel_schedule_course`.`id_course` = `dat_course`.`id`
  AND   `dat_schedule`.`id`               = `rel_schedule_course`.`id_schedule`
  AND   `dat_subject`.`id`                = `dat_schedule`.`id_subject`
  AND   `dat_room`.`id`                   = `dat_schedule`.`id_room`
  AND   `dat_teacher`.`id`                = `dat_schedule`.`id_teacher`';
/****************************************************************************************************/
?>
 
Hi,

das ist doch nur eine andere Syntax für den Join. Ich wüsste nicht, dass das einen Unterschied macht. Mach halt mal einen EXPLAIN auf die Abfrage und einen auf die Abfrage mit anderer Syntax...

LG
 
Danke für den Hinweis mit EXPLAIN. Angesichts der geringen Zeit die für diese Anfrage gebraucht wird und der Tatsache, dass ich diese Syntax besser verstehe, werde ich wohl bei dieser bleiben. Ich danke dir.
 
Vielleicht lässt sich was verbessern indem man die Bedingungen nach vorne setzt, die am meisten Zeilen eliminieren. Falls mySQL die Sachen nacheinander abarbeitet wie bei diversen Programmiersprachen, dann bringt das was.

Analoges Beispiel aus PHP:
PHP:
$a = $b = 1;
if ($a != 1 && $b = 1)
{
  // das zweite wurde nicht verarbeitet, da das erste schon nicht stimmt
}

if ($a == 1 && $b == 1)
{
  // beide wurden verarbeitet
}

Etwas anderes, das ich selbst nie getestet habe, ist die Anweisung so zu schreiben "wie ein Mensch in Tabellen suchen würde". Das läuft auf mehrere Subquerys hinaus: http://phpperformance.de/vom-kleinen-aufs-grosse-schliessen/
 
ich erkläre einmal kurz was ich vor habe: Man stelle sich vor, dass ich in einer Datenbank Tabellen habe in denen Datensätze zu Fächern, Klassen/Kursen, Lehrern, Gebäuden und Räumen existieren. Da es ein Vertretungsplan werden soll habe ich noch eine Tabelle für den normalen Stundenplan und eine für die Vertretungsstunde. Letzteres wäre jetzt zu ignorieren. Und dann gibt es noch zwei Tabellen, welche die Tabellen "Stundenplan-Kurs" und "Lehrer-Fach" beinhalten. Mit meiner Anfrage will ich nun erreichen, dass erst einmal die ID des Kurses gesucht wird. Dann suche ich mit dieser nach allen Unterrichtsstunden. Zu den Unterrichtsstunden suche ich jetzt das Fach, den Raum und den Lehrer. Da von diesen aber auch nur die IDs gespeichert wurden, muss ich nun noch in drei weiteren Tabellen nach den Daten zu diesen suchen.

Deshalb danke für die Idee mit den Subquerys, aber ich habe immer das Problem, dass ich dann mehr als nur einen Datensatz erhalte und dann mit der Menge von Datensätzen nicht weitersuchen kann.
 
Hi,

Mit meiner Anfrage will ich nun erreichen, dass erst einmal die ID des Kurses gesucht wird. Dann suche ich mit dieser nach allen Unterrichtsstunden. Zu den Unterrichtsstunden suche ich jetzt das Fach, den Raum und den Lehrer.

Warum suchst Du zu allen Unterrichtsstunden das Fach? :suspekt:
Das Fach gehört doch bestimmt zum Kurs und ist für alle Unterrichtsstunden desselben gleich?

LG
 
Darf ich dir mal zeigen ... Wieso frag ich? Ich tue es eh gleich.

Das wäre meine vorläufige Tabellenstruktur:
  • Plan
    • PlanID
    • Gültig ab (Datum)
    • KlasseID
  • Stunden
    • PlanID
    • Stunde
    • LehrerID
    • FachID
    • RaumID
  • Vertretung
    • PlanID
    • Datum
    • Lehrer

Da es eh noch durch ein Programm geht, steht hier nur "Stunde" welches eine Zahl stellvertretend für die Stunden von Montag erste bis Freitag letzte ist. Da die Stundenzahl eh begrenzt ist pro Tag kann sehr simpel in einem Programm umgesetzt werden
PHP:
if ($row['Stunde'] > $tag * 24)
{
  // nächster Tag
  $tag++;
}

Und wenn man sich zu einem Zeitpunkt befindet an dem ebenfalls etwas in "Vertretung" mit passenden Datum (DATETIME) steht. Zur Vereinfachung, kann man noch statt der richtigen Zeit die Zahl der Stunde (wie aus der Tabelle "Stunden") bei den Minuten eintragen. Problematisch bei Berufsschulen, da diese teilweise auch Abends unterrichten, aber nicht unlösbar.

Was sagen denn die Stundenplaner, wie sie es bisher immer machen? ;)

Desweiteren gibt es noch diverse Tabellen, wie Klasse, Lehrer, Räume etc.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück