Programmierer: Vereinfachung von Mysql-querys

Beitrag lesen

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...