Kermit: Doubletten-Check Abfrage optimieren

Hallo,
arbeite mit MySql 4.0
Habe eine Abfrage, mit der ich E-Mail Doubletten aus einer Verteilerliste raussuchen will. Da die Verteilerliste aber weit über 5000 Einträge hat, dauert die Abfrage so wie sie ist zu lange (führt zu Abbruch des Session-Handlers).
Was könnte man besser machen?

select distinct a.newsletter_id, a.email_address from t_newsletter as a, t_newsletter as b where a.email_address = b.email_address and a.newsletter_id <> b.newsletter_id order by email_address, newsletter_id

Grüße,
Kermit

  1. Hi,

    abbrechen sollte eine so kleine Abfrage eigentlich nicht - sie sollte eigentlich gar nicht so ewig brauchen, ist ja lediglich ein Join.
    Ist newsletter_id ein Primärschlüssel? Wenn nein, liegt ein Index drauf? Liegt auf email_address ein Index?
    Es würde die Verarbeitung erheblich beschleunigen, wenn die Datenbank auf Indizes zurückgreifen könnte. Ich glaube mittels EXPLAIN <statement> kannst du dir ausgeben lassen, was sie im Moment tut.
    Falls sie von Hand joint, lege einen Index über beide Spalten an.

    MfG
    Rouven

    --
    -------------------
    There's no such thing as a free lunch  --  Milton Friedman
    1. yo,

      abbrechen sollte eine so kleine Abfrage eigentlich nicht - sie sollte eigentlich gar nicht so ewig brauchen, ist ja lediglich ein Join.

      ich vermute, er meint damit, dass php abbricht und nicht mysql.

      Ist newsletter_id ein Primärschlüssel? Wenn nein, liegt ein Index drauf?

      würde für diese abfrage wenig bringen, da er die newsletter_id nicht auf gleichtheit abfragt, sondern auf ungleichheit.

      Ilja

  2. hi,

    Habe eine Abfrage, mit der ich E-Mail Doubletten aus einer Verteilerliste raussuchen will.

    select distinct a.newsletter_id, a.email_address from t_newsletter as a, t_newsletter as b where a.email_address = b.email_address and a.newsletter_id <> b.newsletter_id order by email_address, newsletter_id

    Statt einem JOIN bietet es sich vielleicht eher an, nach der E-Mailadresse zu gruppieren, und dann nur die Datensätze liefern zu lassen, bei denen COUNT() einen Wert > 1 liefert.

    Dann hättest du schon mal alle E-Mailadressen, die mehrfach auftauchen - und kannst dann diese gezielt selektieren lassen, wenn du an den einzelnen Datensätzen interessiert bist.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. yo,

      Statt einem JOIN bietet es sich vielleicht eher an, nach der E-Mailadresse zu gruppieren, und dann nur die Datensätze liefern zu lassen, bei denen COUNT() einen Wert > 1 liefert.

      grundsätzlich der richtige ansatz, nur wird er dabei probleme bekommen, wenn er beide spalten angezeigt haben will und nicht nur die entsprechende e-mail, weil er mit mysql 4.0 keine unterabfragen machen kann. insofern kann der self-join schon der richtige weg sein, ein index auf der emailadresse sollte das problem beheben. des weiteren kann man sich eventuell das DISTINCT sparen, es solten keine doppelten einträge in der ergebnismenge vorkommen, falls es sich bei a.newsletter_id um einen primär und nicht einen fremdschlüssel handelt.

      Ilja

  3. Hallo Forum,

    Habe eine Abfrage, mit der ich E-Mail Doubletten aus einer Verteilerliste raussuchen will.

    Warum liegt auf dem Feld kein unique-constraint?

    Wenn ich ein Datenbank-Design machen will frage ich mich immer als erstes, welcher Wert oder welche Wertekombination nicht doppelt vorkommen darf.

    Gruß
    Alexander Brock

  4. Hallo,
    erstmal danke für die Antworten.
    Die ID ist der Primärschlüssel für die Tabelle.
    Nein Index hatte ich noch keinen auf der E-Mailadresse - werde ich aber jetzt machen.

    Problem ist entstanden, da ich eine umfangreiche Adressenlsite importieren mußte und die nicht auf Doubletten überprüft war.

    Danke und Grüße,
    Kermit