Hallo,
EXPLAIN SELECT m.user_id, m.berecht, v.branche1, v.branche2, v.branche3, v.mo_v1, v.mo_v2, v.mo_n1, v.mo_n2, v.di_v1, v.di_v2, v.di_n1, v.di_n2, v.mi_v1, v.mi_v2, v.mi_n1, v.mi_n2, v.do_v1, v.do_v2, v.do_n1, v.do_n2, v.fr_v1, v.fr_v2, v.fr_n1, v.fr_n2, v.sa_v1, v.sa_v2, v.sa_n1, v.sa_n2, v.so_v1, v.so_v2, v.so_n1, v.so_n2, m.firma, m.strasse, m.plz, m.ort, m.tel, m.email, m.homepage, MIN(w.start), MAX(w.end) FROM (verzeichnis AS v INNER JOIN member AS m USING (user_id) LEFT JOIN werbung AS w ON m.user_id=w.user_id) WHERE (MATCH (m.firma,m.name,m.vorname,m.strasse) AGAINST ('+anwalt*' IN BOOLEAN MODE) OR MATCH (v.begriffe) AGAINST ('+anwalt*' IN BOOLEAN MODE)) GROUP BY m.user_id ORDER BY m.firma
Da Du drei Tabellen joinst, ist natürlich zunächst mal der JOIN zu erstellen. Die EXPLAIN-Resultate beziehen sich offensichtlich hauptsächlich darauf. Der Fulltext-Index wird nur noch für die Volltextsuche wirksam, oder funktioniert die nicht?
Das Resultat war:
table type possible_keys key key_ len ref rows Extra
v ALL PRIMARY NULL NULL NULL 114187 Using temporary; Using filesort
Die Tabelle v hat ein Problem, da hier kein Index genutzt werden kann. Gibt es außer PRIMARY welche? Es muss eine temporäre Tabelle erstellt werden und filesort muss angewendet werden, um Group By und Order By unter einen Hut zu bringen, da diese zwei unterschiedliche Felder betreffen. Hier wäre zum Optimieren anzusetzen.
m eq_ref PRIMARY PRIMARY 4 db657894.v.user_id 1 Using where
Das ist doch optimal. Der type eq_ref ist für einen JOIN optimal. Der mögliche Index wird angewendet. WHERE wird angewendet, um die zu joinenden Datensätze einzuschränken. Top.
w ref user_id user_id 4 m.user_id 22
Nicht optimal, aber wahrscheinlich nicht zu ändern. Der type ref resultiert aus dem LEFT OUTER JOIN. Sonst OK.
http://www.mysql.com/doc/en/EXPLAIN.html
viele Grüße
Axel