Problem: MYSQL-Abfrage dauert > 45 s

-Karsten-

Grünschnabel
Ich habe eine kleine Datenbank in der Dokumente indiziert werden. Das heißt alle Wörter werden als Index gespeichert. Meine Tabellen:

doc_archiv(doc_id,doc_name,doc_path)
index_in_doc(doc_id,index_id)
word_index (index_id,word)

Ich möchte abfragen, welche Wörter in bestimmten Dokumenten enthalten sind.
Mein Query:

SELECT DISTINCT archiv.doc_name, archiv.doc_path FROM doc_archiv as archiv INNER JOIN index_in_doc as im on archiv.doc_id = im.doc_id WHERE ( im.index_id = ANY(SELECT index_id FROM word_index WHERE word = 'irgendwas') AND im.doc_id = ANY( SELECT doc_id FROM index_in_doc WHERE index_id = ( SELECT index_id FROM word_index WHERE word = 'anderes') ));

Hat vielleicht jmd. eine Idee? Die Schwierigkeit besteht darin dass alle Wörter in den Dokumenten vorkommen müssen. Google bekommt das ja auch hin. Ich hoffe mir kann jmd. helfen...

Karsten
 
Zuletzt bearbeitet:
Du nutzt in deiner Abfrage auch noch eine Tabelle index_in_mail.
Zum einen schränkst du nach 'irgendwas' ein und zum anderen nach 'anderes'.
Beides muss vorkommen. Ich gehe mal davon aus, dass die index_in_mail tabelle genauso aufgebaut ist wie die index in doc.

Kannst du mal überprüfen, ob eine Version ohne Subselects schneller ist?
SQL:
select archiv.doc_name, archiv.doc_path
from doc_archiv as archiv
join index_in_doc as id on archiv.doc_id = id.doc_id
join index_in_mail as im on archiv.doc_id = im.doc_id
join wordindex as wi_id on id.index_id = wi_id.index_id
join wordindex as wi_im on im.index_id = wi_im.index_id
where wi_id.word = 'irgendwas'
and wi_im.word = 'anderes'

Die Abfrage geht davon aus, dass index_in_mail genauso aufgebaut ist wie index_in_doc und ebenfalls eine m:n Beziehung zwischen doc_archiv und word_index abbildet.
Sie sollte ausserdem alle Einträge liefern, die bei der "in_doc" Beziehung das Wort 'irgendwas' enthalten und bei der "in_mail" Beziehung das Wort "anderes". Das sollte so ziemlich dem entsprechen, was du in deinem Query abfrägst.

Aber das passt irgendwie nicht zu deiner Aussage:
> Ich möchte abfragen, welche Wörter in bestimmten Dokumenten enthalten sind.
Denn der obere Query sucht ja: In welchen Dokumenten sind folgende Worte vorhanden?
 
Erst einmal vielen Dank für Deine schnelle Antwort, Olgs. Mit dem index_in_mail habe ich mich verschrieben. Naja, hab wohl viel zu lange rumprobiert in meiner Verzweiflung. Hab es jetzt aber korrigiert. War aber nicht der Fehler, hatte es hier nur falsch reingesetzt.
Werde Deinen Query morgen mal ausprobieren.
Ich hatte leider vergessen mail_id und doc_id zu indizieren. Dadurch kam die Verzögerung zustande.
Meld mich morgen nochmal, ob dein Query eine Steigerung gebracht hat. Bis dahin viel Spaß bei was auch immer ;-)

Karsten
 
Wenn das index_in_doc und index_in_mail die gleiche Tabelle ist vereinfacht sich natürlich das ganze :)

SQL:
SELECT archiv.doc_name, archiv.doc_path
FROM doc_archiv AS archiv
JOIN index_in_doc AS id ON archiv.doc_id = id.doc_id
JOIN wordindex AS wi ON id.index_id = wi.index_id
WHERE wi.word = 'irgendwas'
AND wi.word = 'anderes'
 
Zurück