Archiv verlassen und diese Seite im Standarddesign anzeigen : Speed-Problem mit Tabellenverknüfungen
Hallo,
Ich soll 5 Tabellen einer Datenbank miteinander verknüpfen.
Die Abfragen sind echt komplziert mit Zählen der Datensätze, group by usw.
Ich habe jetzt Probedatenbanken mit ca. 5000 Datensätzen und brauche bei der Verknüpfung von 3 Tabellen bereits 2 Minuten an Abfragezeit; trotz Index.
Jetzt hatte ich die Idee temporäre Tabellen zu erzeugen, die nur noch die benötigten Spalten enthalten.
Ist das schneller? Hat jemand damit Erfahrung??
mehlvogel
17-02-2003, 13:58
1. Was ist das für ein Server auf dem die Datenbank läuft?
2. Was sind das für Tabellen und was musst du an Daten abfragen?
Wenn das Blobs, etc sind, nutzt es nichts die Daten nochmal irgendwo zu speichern. Ich würde mir den Query mal "erklären" lassen (also mit EXPLAIN Abfragen) und das Auswerten - dort siehst du welche Keys und Indizes er benutzt. Denn eigentlich sind 5000 nicht die Menge um dafür 2 Minuten zu brauchen. (Ist da auch die Übertragungsdauer abgerechnet? - Denn der Inhalt der Seite wird ja auch übertragen)
PS: Ich gehe einfach mal davon aus, das es ein Webprojekt ist, da du hier ja im PHP Forum gepostet hast.
Hallo Jana!
Könntest du die Queries mal posten?
Im Normalfall lässt sich da noch einiges optimieren...
Ich muß ausgerechnet mit der größten Tabelle anfangen, da ich alle schulaemter brauche:
global $frage_1;global $frage_2;
$frage_1=" select schulaemter.Ort,
count(schulen.id) as Schulenzahl,
schulaemter.Schulamtname
from schulaemter
left join schulen on schulen.schulamtsbezirk=schulaemter.id
left join trainer on trainer.schulnummer=schulen.id
group by schulaemter.id
order by schulaemter.ort";
$frage_2=" select schulaemter.Schulamtname,
count(trainer.id) as Trainerzahl
from schulaemter
left join schulen on schulen.schulamtsbezirk=schulaemter.id
left join trainer on trainer.schulnummer=schulen.id
where trainer.flag_1>0
group by schulaemter.id
order by schulaemter.ort";
print "<br><br><br>Anzahl der Schulen und Trainer nach Schulämtern:<br><br>";
$schulamt = new PrintBox();
$schulamt-> two($frage_1,$frage_2);
Das nächste Problem ist, daß beide Abfragen in eine Tabelle sollen und die Frage 2
weniger Antworten enthält als die Frage 1, weil es nicht in jedem Schulamt einen Trainer gibt.
Mit dieser PrintClass geht es jedenfalls nicht:
function two($frage_1,$frage_2) {
require("./connect.php");
$db = DB::connect($dsn);
$result_1 = $db->query($frage_1);
$result_2 = $db->query($frage_2);
//********* Textausgabe
print "<table>\n";
while ($row_2 = $result_2->fetchRow(DB_FETCHMODE_ASSOC))
{print "<tr>\n";
$row_1 = $result_1->fetchRow(DB_FETCHMODE_ASSOC);
foreach ($row_1 as $field => $value) {
print "<td nowrap class='lay200b'>$value</td>\n";
}
foreach ($row_2 as $field_2 => $value_2) {
print "<td class='lay200a'><b>$value_2</b> </td>";
}
print "</tr>\n";
}
print "</table>\n"; }
:confused:
Ich hab noch ne Idee.
Kann man aus der Tabelle trainer nicht eine Tabelle machen, in der alle Trainer einen die Bedingung trainer.flag>0 erfüllen?
Dann kann ich mir eine Abfrage sparen (Halbe Rechenzeit) und hab das Problem mit der Tabelle nicht mehr. ????
Ehrlich ich kann mir nicht vorstellen, daß jemand durch meine Datenbankabfragen durchsteigt. ;)
Vielleicht weiß jemand eine Möglichkeit, wie ich mit Hilfe von PHP eine bestehende
Tabelle dubliziere, so daß ich einen Klon habe.
Ich finde da leider nichts.
Vielen Dank im vorraus
Ich hab den Befehl gefunden, mit dem man Datenbanken kopieren kann.
$sqlab="create table backuptable select * from trainer";
mysql_db_query("datenbank", $sqlab);
Damit ist das Problem gelöst.
Vielen Dank für die Hilfe
Hallo Jana!
Durchsteigen tu ich da schon, aber ich hab im Moment leider keine Möglichkeit das ganze mal durchzutesten.
Wäre nett, wenn du vielleicht nen Struktur Dump von deinen Tabellen posten bzw. als Datei anhängen könntest.
EDIT: Wenn das Problem gelöst ist is auch gut...
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.