Vielen Dank für deine Nachricht...
Das Problem ist jedoch etwas verzwickter.
Beschreibung:
Es handelt sich um einen Vokabeltrainer. Die Wörter (Fremdwörter) sind in Lektionen und Bücher geordnet. Also wie eine Hierarchie: Bücher - Lektionen - Wörter
Ich habe drei Tabellen:
buecher (ca. 1500 Datensätze):
+----+-----------+-----------+
|id |name |userid |
+----+-----------+-----------+
lektionen (ca. 24'000 Datensätze):
+----+-----------+-----------+
|id |name |buchid |
+----+-----------+-----------+
woerter (ca. 900'000 Datensätze):
+----+-----------+-----------+-----------+
|id |sprache1 |sprache2 |lektionenid|
+----+-----------+-----------+-----------+
"name" ist immer der Name des Buches / der Lektion
"userid" ist eine Session-Variable, damit nur die "eigenen" Bücher angezeigt werden können (auf dieser Spalte ist ein Index)
"buchid" weist die Lektion einem Buch zu (auf dieser Spalte ist ein Index)
"lektionenid" weist das Wort einer Lektion zu (auf dieser Spalte ist ein Index)
"sprache1" ist das Wort in der Muttersprache
"sprache2" ist das Wort in der Fremdsprache
Da ich (wie oben geschrieben) mit sehr vielen Datensätzen hantiere, muss ich die Abfragen sehr effizient gestalten.
Wenn nun alle eigenen Bücher (userid = $_SESSION["userid"]) angezeigt werden, habe ich eine Suche gemacht, die sofort nach jeder Eingabe eines Buchstabens die ganzen "eigenen" Bücher, Lektionen und Wörter durchgeht und prüft, ob die aktuelle Eingabe im Buchnamen, Lektionennamen, sprache1 oder sprache2 vorhanden ist und die dazugehörigen Buch-ID ausgibt. Dazu habe ich folgende Abfrage geschrieben:
SELECT id
FROM buecher
WHERE userid = '<?= $_SESSION["userid"] ?>'
AND (
name LIKE '%eingabe%'
OR id
IN (
SELECT buchid
FROM lektionen
WHERE name LIKE '%eingabe%'
)
OR id
IN (
SELECT (
SELECT buchid
FROM lektionen
WHERE id = woerter.lektionenid
)
FROM woerter
WHERE (
sprache1 LIKE '%eingabe%'
OR sprache2 LIKE '%eingabe%'
)
)
)
Diese Abfrage dauert bei mir jedoch ca. 22 Sekunden, was viel zu lang ist!
Kann ich diese Subquerys nicht verbessern, damit z.B. nicht mehr die ganze Wörter-Tabelle durchgetestet werden muss (habe das mit EXPLAIN SELECT gesehen, dass alle wörter durchgetestet werden müssen).
Ich hoffe, ihr versteht mein Problem...