mixmastertobsi: einfache MySQL ABfrage kompliziert

Hallo,

ich versuche über zwei Tabellen hinweg zu suchen.

Tabelle 1

Kunden

KNR | EMAIL | TYP
-----------------
1   | mail1@| e
2   | mail2@| e

Tabelle 2

Adressen

ID | KNR | NAME | PLZ
----------------------
1  | 1   | test | 74374
2  | 2   | test | 54564

meine MySQL Abfrage funktioniert, ist aber extram langsam, weil es in Tabelle 1 über 20000 Kunden gibt und in Tabelle 2 über 30000 Adressen.
Den INDEX habe ich auf KNR, PLZ und EMAIL.

Im Suchfeld gebe ich zum Beispiel folgendes ein
mail1@

SELECT ... FROM tabelle1 LEFT JOIN tabelle2 ON tabelle2.knr=tabelle1.knr WHERE tabelle1.email='mail1@' OR tabelle2.plz='mail1@'

Wo und wie kann ich diese "SUCHE" optimieren.
Ohne dieses OR in der WHEREKLAUSEL läuft es wesentlich schneller - aber so sucht MySQL in Tabelle1 in allen Reihen.

  1. moin,

    Den INDEX habe ich auf KNR, PLZ und EMAIL.

    welche tabellen, zusammengesetzte indexe oder jeweils einen pro spalte ?

    SELECT ... FROM tabelle1 LEFT JOIN tabelle2 ON tabelle2.knr=tabelle1.knr WHERE tabelle1.email='mail1@' OR tabelle2.plz='mail1@'

    und vor allem, was willst du den fachlich mit der abfrage erreichen ?

    Ilja

  2. Lieber mixmastertobsi,

    ich versuche über zwei Tabellen hinweg zu suchen.

    das kommt mir aber sehr bekannt vor...

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. Hallo,

    SELECT KNR
    FROM tabelle1
    WHERE email = '######'
    UNION                 -- bewusst nicht UNION ALL weil wir ja doppelten KNR haben wollen?
    SELECT KNR
    FROM tabelle2
    WHERE plz = '######'

    Der Rest zur Optimierung ist Frage der passenden Indizierung.

    Ciao, Frank