Thomas: grosse MySQL query

hi,

ich habe ein Performance Problem mit folgender SQL query in perl.

SELECT DISTINCT mitglied.pkmitglied, mitglied.firmenname, mitglied.ZS_Strasse, mitglied.ZS_PLZ, mitglied.ZS_Ort      
           FROM mitglied
      LEFT JOIN berechtigung  ON (mitglied.pkmitglied = berechtigung.rkmitglied)
      LEFT JOIN fachgruppezug ON (berechtigung.rkmitglied = fachgruppezug.rkmitglied AND berechtigung.rkberechtigung = fachgruppezug.rkberechtigung)
      LEFT JOIN prodfach      ON (fachgruppezug.rksektion = prodfach.rksektion AND fachgruppezug.rkfachgruppe = prodfach.rkfachgruppe)
      LEFT JOIN produkt       ON (prodfach.rkprod = produkt.pkprod)
          WHERE produkt.name like '%$suchbegriff%'
          LIMIT 25;

das ganze soll zu einem bestimmten produkt ueber 6 Tabellen zu einem oder mehreren Firmen Führen.

danke fuer infos

-t

  1. Hi Thomas,

    ich habe ein Performance Problem mit folgender SQL query in perl.

    Naja, ein JOIN über 6 Tabellen ist auch nicht unbedingt ein Kinkerlitzchen. Nach meinen Erfahrungen sind JOINS über mehrere Tabellen in MySQL generell recht unperformant, irgendwie scheint der Server im Speicher zuerst alle Kombinationen zu bilden, und die dann nach where und on-klauseln zu filtern, so daß die Abfragezeit schnell ins Uferlose wächst, auch wenn man am Ende nur ein Resultset mit 3 Ergebnissen hat. Deshalb wäre es am besten, wenn Du dir ein paar Joins sparen könntest, und stattdessen zwei selects nacheinander machst, 'LEFT JOIN berechtigung' und 'LEFT JOIN fachgruppezug' schaut mir z.B. nach einem Zugriffsschutz aus, den könnte man vielleicht eventuell vorher abfragen?
    Ansonsten bleiben Dir nur die üblichen Optimierungen

    • statt 'like '%$suchbegriff%'' 'like '$suchbegriff%'' verwenden, dann kann MySQL den Index auf produkt.name nutzen
    • auf alle Felder, die in den Joins verwendet werden, einen Index setzen

    Viele Grüße
    Stephan