Avatar billede mantichora Nybegynder
09. oktober 2009 - 11:11 Der er 11 kommentarer og
1 løsning

Optimering af simpelt kald til halvstor tabel

Jeg har en temmelig primitiv MySQL-log på flere af mit firmas sider, som oprindeligt var ment som en test, men nu indeholder næsten to millioner rækker, og bliver brugt ret meget.

Det er til gengæld også begyndt at tage et godt stykke tid at hente data ud fra den. Det er muligvis bare et onde man må tage med, når man gerne vil tælle 100.000 rækker, men jeg vil lige høre om der er noget jeg kan gøre bedre.

Strukturen er bare: INT id, INT time, INT site_fk, VARCHAR(128) user_agent, VARCHAR(128) referrer

Kaldet er også ganske simpelt:
SELECT COUNT(id), COUNT(DISTINCT ip) FROM logall_hits WHERE time>$t1 AND time<$t2 AND site_fk=$site

Oprindeligt brugte jeg CHARs til ua og referrer, da jeg troede det ville være bedre, men det viste sig at med VARCHARs i stedet gik det flere gange hurtigere.

En EXPLAIN på SQL'en giver:
Type: range
possible keys: site_fk, time
key: time
key_len: 4
ref: NULL
extra: using where


- Kan jeg gøre noget ved den? Helst uden at flytte de to strenge hen i en anden tabel, men hvis det vil give et kæmpe boost, er det svar også påskønnet.
Avatar billede arne_v Ekspert
09. oktober 2009 - 14:45 #1
Er der index paa time og site_fk felterne?
Avatar billede mantichora Nybegynder
09. oktober 2009 - 17:15 #2
Ja.
Avatar billede arne_v Ekspert
09. oktober 2009 - 20:00 #3
Giver du din MySQL server godt med memory?
Avatar billede arne_v Ekspert
09. oktober 2009 - 20:01 #4
Hvis du skal lave queryen for flere site_fk, saa kan du fjerne den fra WHERE og i.s.f. lave en GROUP BY paa den. Det vil formentligt vaere hurtigere.
Avatar billede arne_v Ekspert
09. oktober 2009 - 20:02 #5
Hvad data typer er ip?
Avatar billede mantichora Nybegynder
09. oktober 2009 - 21:33 #6
Hov ja, jeg kan se jeg glemte at skrive ip i strukturen. Den er også INT. Hukommelsesmæssigt får den hvad vores udbyder giver den. De er lidt tunge at danse med, og vi overvejer at skifte, men lige nu er der ikke så meget at gøre.

Mht. GROUP, så hiver jeg altid kun data ud fra én side ad gangen, så en WHERE er vel det mest hensigtsmæssige?
Avatar billede arne_v Ekspert
10. oktober 2009 - 00:28 #7
Min pointe er netop at hente 50 ud på en gang på 3 minutter er noget bedre end at hente 50 ud en af gangen på 1 minut hver.
Avatar billede arne_v Ekspert
10. oktober 2009 - 00:28 #8
Er der index på ip ?
Avatar billede mantichora Nybegynder
10. oktober 2009 - 01:25 #9
Ja, der er index på ip.
Og rigtigt, det ville være mere praktisk at hente det hele ud på én gang, men vi skal sjældent bruge data fra alle siderne samtidig. For det meste ringer min chef ned og beder om nogle tal for en periode på en af siderne, og så hiver jeg dem ud.

- Men altså, det virker ikke som om jeg har lavet nogle store brølere, så der er vel bare ikke så meget at gøre ved det. Det er også et acceptabelt svar, selvom jeg naturligvis havde håbet på at kunne optimere det lidt. Læg bare svar.

Forresten, måske kan du svare mig på én ting: er der nogen forskel på at oprette ét index for alle tre kolonner, og at oprette tre forskellige indexes - et for hver?
Avatar billede arne_v Ekspert
10. oktober 2009 - 01:38 #10
Umiddelbart lyder det som om det er MySQL serveren der skal fokuseres på for at få bedre performance.

Og et svar.
Avatar billede arne_v Ekspert
10. oktober 2009 - 01:40 #11
Jeg er ikke ekspert i MySQL index men generelt vil jeg forvente følgende:

index (a,b)

kan bruges på:

WHERE a=x
WHERE a=x AND b=y

men ikke på:

WHERE b=y

index (a)
index (b)

kan bruges på:

WHERE a=x
WHERE b=y
WHERE a=x AND b=y
Avatar billede mantichora Nybegynder
10. oktober 2009 - 15:45 #12
Tak for hjælpen.
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