Axel Richter: MYSQL - Fulltext und Abfrage über mehrere Tabellen

Beitrag lesen

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