Ich habe eine SQLite-DB mit etwa 24k Datensätzen in einer der Tabellen und 15 in der anderen. Die Tabelle mit 15 Datensätzen enthält Informationen über Formulare, die von Benutzern ausgefüllt werden müssen (etwa 1k Benutzer). Die Tabelle mit den 24k Datensätzen enthält Informationen darüber, welche Formulare von wem und wann ausgefüllt worden sind. Wenn sich ein Benutzer anmeldet, dauert es etwa 3/4 Sekunden, bis die Abfragen laufen, um festzustellen, was der Benutzer bis dahin erledigt hat. Für meinen Kunden ist das zu lang. Ich weiß, dass ich meine Abfragen nicht optimal durchführen kann, da sie in einer Schleife enthalten sind. Aber ich scheine nicht herauszufinden, wie ich meine Abfrage optimieren kann.
Die Abfragen laufen wie folgt ab:
1) Wählen Sie alle Formulare und Informationen aus
$result = $db->query("SELECT * FROM tbl_forms");
while($row = $result->fetchArray()){
//Run other query 2 here
}
2) Führen Sie für jedes Formular/jede Zeile eine Abfrage aus, die herausfindet, welche Informationen der Benutzer zuletzt über dieses Formular erhalten hat.
$complete = $db->querySingle("SELECT * FROM tbl_completion AS forms1
WHERE userid='{$_SESSION['userid']}' AND form_id='{$row['id']}' AND forms1.id IN
(SELECT MAX(id) FROM tbl_completion
GROUP BY tbl_completion.userid, tbl_completion.form_id)", true);
Es gibt 15 Formulare, d.h. es laufen insgesamt 16 Abfragen. Jedoch mit meiner Tabelle Struktur, ich bin unsicher, wie die "neuesten" (aka max form id) Formular Informationen mit 1 verbunden Abfrage stattdessen zu erhalten.
Meine Tabellenstruktur sieht wie folgt aus:
tbl_forms:
id | form_name | deadline | required | type | quicklink
tbl_completion:
id | userid | form_id | form_completion | form_path | timestamp | accept | reject
Edita: Index on tbl_forms (id), Index on tbl_forms (id, form_name), Index on tbl_complete (id)
Ich habe versucht, eine Abfrage zu verwenden, die wie folgt lautet:
SELECT * FROM tbl_completion AS forms1
LEFT OUTER JOIN tbl_forms ON forms1.form_id = tbl_forms.id
WHERE forms1.userid='testuser' AND forms1.id IN
(SELECT MAX(id) FROM tbl_completion GROUP BY tbl_completion.userid, tbl_completion.form_id)
Das einzige Problem dabei ist, dass ich alle Formulare in einer Tabelle ausgeben muss (z. B.: Formular 1 - unvollständig, Formular 2 - ausgefüllt usw.). Ich kann nicht herausfinden, wie ich es hinbekomme, dass die linke Tabelle tbl_forms ist und alle Formularinformationen sowie die "neuesten" Formularinformationen tbl_completion enthält. Ich habe auch versucht, eine 3 LOJ mit der letzten "Tabelle" als temporäre Tabelle, die die maxid hält, zu machen, aber es war sehr langsam UND gab mir nicht, was ich wollte.
Kann jemand helfen? Gibt es eine bessere optimierte Abfrage, die ich einmal ausführen kann, oder kann ich auf der DB-Seite etwas anderes tun, um dies zu beschleunigen? Ich danke Ihnen im Voraus.