09. oktober 2009 - 11:11Der 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.
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?
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?
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.