Langsomme udtræk grundet "NOT IN ()" - Mangler jeg indeksering?
Hej exp!Jeg har lavet et lille system, som sender mails ud til mine brugere. Udsendingen bliver segmenteret erfter forskellige parametre (køn, alder osv.), men det fremgår vist af queriesne. Det skal siges, at disse betingelser i queriesne ikke er skyld i problemerne, da jeg har prøvet at fjerne dem uden held.
Jeg har to queries, som begge er for langsomme og jeg ønsker at optimere.
Den første query henter det totale antal modtagere, der ikke har en entry i send_log:
SELECT COUNT(*) FROM maillist WHERE id NOT IN (SELECT bruger_id FROM `send_log` WHERE brev_id='15') AND deleted='0' AND koen='k' AND (YEAR(CURDATE())-dob) >= 14 AND (YEAR(CURDATE())-dob) <= 29 AND ref IN ('1','2','3','4','6','7','8','9','')
Den tager 2.4 sekunder, hvilket er for lang tid i mine øjne. Din "indre query", tager 0.0006 sek, så den laver ikke ballade.
Jeg har indekseret id (primary), deleted, koen, dob, ref. Nogen der kan gennemskue, hvad der tager lang tid?
Næste query er ligeledes lidt langsom, den tager 0.05 sek til at starte med, men i takt med at jeg sender mere ud (og send_log vokser), tager den op til 2.0 sek. Den er næsten identisk med den første query, bortser fra COUNT(*) og LIMIT 0,50:
SELECT * FROM maillist WHERE id NOT IN (SELECT bruger_id FROM `send_log` WHERE brev_id = '15') AND deleted='0' AND koen='k' AND (YEAR(CURDATE())-dob) >= 14 AND (YEAR(CURDATE())-dob) <= 29 AND ref IN ('1','2','3','4','6','7','8','9','') LIMIT 0,50
Mit spørgsmål er nu; hvordan for jeg fundet evt. langsomme elementer? Kan i bruge en "EXPLAIN" til noget?
Håber nogen sidder inde med en løsning :)
Mvh
P