Avatar billede pitzen Nybegynder
21. april 2009 - 11:23 Der er 5 kommentarer og
1 løsning

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
Avatar billede arne_v Ekspert
21. april 2009 - 13:25 #1
Har du index på brev_id, deleted, koen og ref ?
Avatar billede arne_v Ekspert
21. april 2009 - 13:25 #2
Ja - en explain kunne godt gøre nytte.
Avatar billede pitzen Nybegynder
21. april 2009 - 15:08 #3
Hej Arne,

Jeg har index på dem alle, ja.. Jeg kan desværre ikke foretage en explain nu, da jeg er på mobilen - men jeg laver den hurtigst muligt :)

Mvh
P
Avatar billede pitzen Nybegynder
21. april 2009 - 21:36 #4
Den er lidt svær at stille overskueligt op, men her er explanation for den første:

id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

1 | PRIMARY | maillist | ref | ref,deleted,koen | koen | 5 | const | 95803 | Using where

2 | DEPENDENT SUBQUERY | send_log | index_subquery | bruger_id,brev_id | bruger_id | 4 | func | 1 | Using where
Avatar billede pitzen Nybegynder
21. april 2009 - 21:38 #5
Explain for query 2 ser ligeledes ud :)
Avatar billede pitzen Nybegynder
29. juni 2010 - 18:36 #6
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester