Hi Stefan,
soweit ich sehen kann ist Dein SELECT in Ordnung und der Output von EXPLAIN ist auch ok. Der Key t1.email wird verwendet, so daß Du kein Kreuzprodukt hast.
Dennoch muß MySQL ca. 150.000 (genauer: 51.003 * 3) rows (Zeilen, Datensätze) anpacken, um zum gewünschten Ergebnis zu kommen. Dies dauert natürlich eine Weile.
Da ich kein MySQL Profi bin bin ich jetzt auch am Ende meines Wissens angelangt und kann Dir nicht mehr weiter helfen. Hier hoffe ich, daß noch andere diesen Thread verfolgen und besser Bescheid wissen.
Die einzigen Mittel, die mir noch einfallen sind:
- Mache vorher ein OPTIMIZE TABLE k_data, um die Keys besser zu sortieren.
- Versuche, die mögliche Treffermenge zu reduzieren, z.B., indem Du zuerst als zusätzliche Einschränkung ... WHERE t1.kid < t2.kid AND t1.kid < 25000 und in einem zweiten Schritt ... AND t1.kid > 24999 (NICHT 25000, sonst fehlt das) bringst oder z.B. WHERE email LIKE "a%" zustäzlich bringst und das Ergebnis dann auf mehrere Male bekommst.
Wenn Du nur die doppelten Einträge eliminieren willst könntest Du auch eine zweite Tabelle anlegen und diese mit
Code:
SELECT DISTINCT(t1.kid, t1.email) FROM k_data AS t1 INTO k_data_temp
füllen. BEACHTE ABER, daß meine Syntax hier nicht stimmen muß, da "freihändig" geschrieben.
Wie geschrieben kann ich Dir momentan nicht mehr weiter helfen, werde aber heute abend (habe gerade kein MySQL zur Hand) ein paar Dinge versuchen und mich eventuell noch mal melden.
Gruß und viel Erfolg,
Andy