Avatar billede mungojerrie Nybegynder
17. maj 2004 - 17:24 Der er 25 kommentarer og
1 løsning

optimering af tabel design

Hej

Jeg vil gerne have lidt input til design af hvordan jeg bedst laver noget statistik over besøg på en hjemmeside. Jeg vil gerne logge disse data:

Customerld
LastModified
Referrer
Title
CIientLanguage
UserAgent
OperatingSystem
CookieEnabled
BrowserType
Href
ScreenWidth
ScreenHeight
ScreenAvaiIWidth
ScreenAvaiIHeight
PixeIDepth
ColorDepth
ScreenCIientWidth
ScreenCIientHeigh
JavaEnabled
UserID
JSVersion
InstalledPIugins
TimeZone
DayVisited
MonthVisited
YearVisited
TimeVisited
RemoteAddress
HostAddress

og det går helt fint, problemet er at hvis alle data bliver gemt i een tabel i stedet for flere, bliver det alt for tungt at eksempelvis bare vise hvor mange unikke besøgende der har været på siden. Så jeg kunne godt tænke mig nogle bud på hvordan man skal gemme data, således man deler kompleksiteten mellem logning af data og præsentation data.
Håber det gav mening......
Avatar billede arne_v Ekspert
17. maj 2004 - 17:44 #1
Jeg tror at din antagelse er forkert.

Hvis det her er de attributter der er på et besøg, så vil det med stor sandsynelighed
give bedst performance med alle felterne i en tabel.
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 17:50 #2
det er muligt at jeg tager fejl, men jeg har lavet lidt test af ovenstående logning med bare een tabel og jeg vil eksempelvis gerne præsentere en lille oversigt over hvormange :
sidevisninger
unikke besøg (browser id)
unikke besøgende (ip adresse)
der har været :
idag
siden i mandags
siden logning startede

Disse data giver umiddelbart 9 udtræk og hvis jeg har 50mb data, skal jeg søge igennem 450mb data for at præsentere disse 9 tal. Det må da kunne gøres bedre.....
:-)
Avatar billede arne_v Ekspert
17. maj 2004 - 18:06 #3
Det problem løser man normalt ved at sætte index på de relevante felter, så man
ikke skal igennem alle data for hver søgning.
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 18:10 #4
det hjælper jo ikke noget når jeg skal alle poster igennem for at lave udtrækket.....
Avatar billede arne_v Ekspert
17. maj 2004 - 18:30 #5
index skulle gerne gøre at du ikke skal alle poster igennem
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 18:33 #6
må vist hellere vise en af de sql sætninger som jeg benytter:

SELECT count(UserID) FROM table WHERE TimeVisited > 'dato' AND TimeVisited < 'dato'
Avatar billede arne_v Ekspert
17. maj 2004 - 18:44 #7
Hvis der er index på dato så vil den query ikke læse alle data (medmindre
den pågældende database software er totalt ubrugeligt)
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 18:46 #8
hmm, hvis jeg skal lave en count er databasen vel nødt til at løbe alle poster igennem, eller er der noget jeg har misforstået ?
Avatar billede arne_v Ekspert
17. maj 2004 - 19:01 #9
Du counter jo kun dem der opfylder betingelsen.

Indexet kan bruges til kun at udvælge dem som opfylder betingelsen.
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 19:27 #10
Ja, det er selvfølgelig rigtigt.
Men hvis min nuværende tabel bare var delt i to, kunne jeg jo nøjes med at gennemløbe halvdelen af den nuværende tabels tupler ved nogen af mine queries, hvis det ellers bliver designet rigtigt.
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 19:56 #12
Okay, nu har jeg læst dine links. Det kan være du kan fortælle mig, hvorfor disse queries der hver bliver kaldt to gange med forskellige datoer, tager over 20 sekunder på en ellers ret hurtig server. Der er lavet index på de datafelter der selecteres på.
Du kan selv afprøve det på http://fcs.skjoldhoej.dk/stat/statistik.php

select count(UserID) from table where TimeVisited > 'date' AND TimeVisited < 'date';

select count(distinct UserID) from table where TimeVisited > 'date' AND TimeVisited < 'date';

select count(distinct RemoteAddress) from table where TimeVisited > 'date' AND TimeVisited < 'date';
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 19:59 #13
der er også et index på TimeVisisted
Avatar billede arne_v Ekspert
17. maj 2004 - 20:01 #14
Har du prøvet at tage tid på de enkelte queries for at se om de alle tager
lige lang tid eller der er nogen specielle syndere ?
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 20:35 #15
Nej, de tager alle mellem 2 og 3 sekunder, hvis jeg "kører" dem direkte på databasen. Og der er jo 9 stk, så et par sekunder til php'en så er vi på 20 sekunder......
Avatar billede arne_v Ekspert
17. maj 2004 - 20:37 #16
Hvor lang tid tager det hvis du laver 3 samtidigt:

select count(UserID),count(distinct UserID),count(distinct RemoteAddress)  from table where TimeVisited > 'date' AND TimeVisited < 'date';

?
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 20:44 #17
har lige prøvet at lave alle 9 queries i samme sætning og det tager samme tid som før......ca 20 sek....
Avatar billede mungojerrie Nybegynder
17. maj 2004 - 20:52 #18
din select sætning med de 3 counts tog 15-17 sek.
Avatar billede arne_v Ekspert
17. maj 2004 - 21:59 #19
Hvor mange rækker er der ialt og hvormange bliver der countet ?
Avatar billede mungojerrie Nybegynder
18. maj 2004 - 06:58 #20
Dette er de data der bliver præsenteret, hvor hver kolonne er:
Tidsperiode, Sidevisninger, Unikke besøg, Unikke besøgende
Idag: 81, 4, 4
Siden mandag denne uge: 400, 36, 34
Siden d. 27/01-2004 * 30261, 1478, 818

Der bliver højst gennemløbet 30261 rækker
Avatar billede mungojerrie Nybegynder
24. maj 2004 - 10:35 #21
havde du nogen kommentarer til dette arne ?
Avatar billede arne_v Ekspert
24. maj 2004 - 22:57 #22
Sorry - den her tråd havde lige forputtet sig

Jeg kan ikke hlet få tingene til atstemme.

Alle queries tager ca. samme tid uanset om det er kun idag eller 4 måneder ?

Der er index for TimeVisited ?

Det lyder mystisk.

Hvilken database bruger du ? PostgreSQL ?
Avatar billede mungojerrie Nybegynder
25. maj 2004 - 07:28 #23
Ja, der er index på timevisited
Nej, alle queries tager ikke lige lang tid, men det gjorde ikke nogen forskel om jeg sendte dem afsted på een gang via min db manager eller en af gangen gennem php. Ja, jeg bruger postgresql
Har dog fundet ud af at mine queries bliver noget hurtigere, hvis jeg benytter "between" i stedet for ">" og "<".
Avatar billede arne_v Ekspert
28. maj 2004 - 21:37 #24
Nu kender jeg ikke PostgreSQL, men nogen databaser har både tree og hash indexes.
Du kan kun udbytte et tree index til den her søgning. Skud i tågen.
Avatar billede mungojerrie Nybegynder
03. juni 2004 - 17:37 #25
har også kun brugt tree indexes....
Avatar billede mungojerrie Nybegynder
22. juni 2004 - 09:49 #26
lukker spg......
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