Avatar billede webcreator Nybegynder
25. juli 2003 - 20:25 Der er 25 kommentarer og
3 løsninger

Mange inputs i DB - måske for meget

Hej.

Jeg har flg. tabel :

CREATE TABLE online (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    IPnr      VARCHAR(255)  NOT NULL,    # Brugerens aktuelle IP
    side      VARCHAR(255)  NOT NULL,    # Kommentaren tilknyttet postIDet
    time      timestamp(14) NOT NULL)    # Brugerens besøgstid

Hver gang, en bruger går ind på en side på mit website, eller laver en "refresh", så indsættes der data i tabellen (som bruges til at tælle nuværende online-brugere samt besøg ialt. Men hvis jeg får 100 besøg om dagen, og de hver besøger 5 sider, så får jeg 500 inputs pr. dag. Det er vel ikke ligefrem "nemt" for min DB.

Nogen forslag til en fornuftig optimering ?
Har overvejet, at lave et tjek, så en bruger kun kan indsætte data én gang, og efterfølgende opdatere sin post. Men er der nogen ideer ? Evt. noget som kunne udføres af databasen ?
Avatar billede arne_v Ekspert
25. juli 2003 - 20:31 #1
Det er ikke noget reelt performance problem.

MySQL kan klare >10000 INSERT per sekund på  en almindelig PC.
Avatar billede jinxit Nybegynder
25. juli 2003 - 20:32 #2
Det skulle ikke være noget problem...

De fleste databaser understøtter tabeller på op til 2TB.

Derudover kan ovenstående tabel indeholde 4,2 mia. records (primary key er en int), hvilket med 500 records om dagen betyder, at du løber tør for plads om ca. 23.534 år
Avatar billede arne_v Ekspert
25. juli 2003 - 20:33 #3
Jeg ville nok gemme brugernavn også fordi det vil give et bedre
indtryk end IP (en der dialer ind via modem kan jo få 10 forskellige IP
i løbet af dagen).
Avatar billede arne_v Ekspert
25. juli 2003 - 20:35 #4
Du kunne godt bare gemme brugernavn + dato + antal logins.

Så kan du ikke bruge det til online vurderinger (men det vil man
nu nok også normalt finde på anden vis).

Så skal su lave INSERT første gang og UPDATE de efterfølgende antal
gange.
Avatar billede webcreator Nybegynder
25. juli 2003 - 20:35 #5
Hehe, lyder jo godt nok. Men hvis du ser min SQL streng, så vil du måske forstå min bekymring. Den skal hen og "søge" (sådan forstår jeg det i hvertfald), for at forhindre gengangere af IPnumre. Sådanne ting må da tage tid med 1 million poster ?

Første sæt viser nuværende online brugere

$online = mysql_query("SELECT COUNT(distinct IPnr) from online where time > (now() - INTERVAL 120 SECOND)");
$online = mysql_result($online,0);

Denne viser totale besøgende.

$besoeg = mysql_query("SELECT COUNT(distinct IPnr) from online");
$besoeg = mysql_result($besoeg,0);
Avatar billede webcreator Nybegynder
25. juli 2003 - 20:38 #6
Arne  > Havde ikke set dine sidste 2 beskeder.

Jeg kender netop ikke brugeren brugernavn - jeg er ikke interesseret i at vide, om de er logget ind. Jeg vil tælle alle.
Avatar billede jinxit Nybegynder
25. juli 2003 - 20:41 #7
Hvis du opretter et index på time kan du forbedre eksekveringstiden for det første query...
Avatar billede webcreator Nybegynder
25. juli 2003 - 20:42 #8
IC.
Det vil jeg gøre så :)
Avatar billede jinxit Nybegynder
25. juli 2003 - 20:42 #9
...og et index på IPnr kan forbedre eksekveringstiden for det andet query...
Avatar billede arne_v Ekspert
25. juli 2003 - 20:43 #10
Den query er ikke så slem.

Men den kan jo fint kombineres med forslaget om bare at gemme antal
gange IP har været der en dag.
Avatar billede arne_v Ekspert
25. juli 2003 - 20:43 #11
OK - så de skal ikke logge ind - ja så kan du jo ikke bruger brugernavn.

:-)
Avatar billede arne_v Ekspert
25. juli 2003 - 20:44 #12
Nej - INDEX på IPnr hjælper ikke på den query !
Avatar billede arne_v Ekspert
25. juli 2003 - 20:45 #13
Men hvis du sætter INDEX på time og lader PHP udregne nu - 120 sek., så
vil det hjælpe !
Avatar billede jinxit Nybegynder
25. juli 2003 - 20:46 #14
Med et tree-index på IPnr slipper databasen for at skulle sortere alle records efter IPnr for at eliminere dubletter
Avatar billede jinxit Nybegynder
25. juli 2003 - 20:48 #15
Derudover kan databasen hente alle informationer fra index'et og slipper derfor for at indlæse selve tabellen.
Avatar billede arne_v Ekspert
25. juli 2003 - 20:53 #16
Det kunne den gøre.

Men gør den ?
Avatar billede mahler Nybegynder
25. juli 2003 - 20:53 #17
Hvis du i IPnr gemmer et IP-nummer, så er det ret fjollet ud fra et performance hensyn at have den som varchar(255). En char(15) vil være langt mere effektiv.

Hvis man skal være rigtig effektiv, ville 4 "tinyint unsigned" (med et kombineret index) sikkert være det mest effektive - men jeg tvivl på du vil kunne mærke forskel.
Avatar billede mahler Nybegynder
25. juli 2003 - 20:56 #18
Hvis du kan lave "side" om til noget andet, vil det sikkert også være en fordel.
Hvis det kun er dine egne sider, så kunne du f.eks. overveje at gemme en MD5 af $_SERVER['PHP_SELF'] eller noget lignende.

Hvis du har få sider, ville det sikkert være bedst at give dem et "fast nummer" hver især, som gives som parameter, til funktionen, der gemmer i databasen.
Avatar billede jinxit Nybegynder
25. juli 2003 - 20:57 #19
Det kommer an på hvor effektiv query optimizer'en i MySQL er...
Avatar billede arne_v Ekspert
25. juli 2003 - 20:59 #20
Korrekt.

Men det er ikke ligefrem den mest oplagte optimering at lave.

Der er heller ikke nævnt i dokumentationen over hvor MySQL bruger
INDEX:
  http://www.mysql.com/doc/en/MySQL_indexes.html
Avatar billede mahler Nybegynder
25. juli 2003 - 20:59 #21
Hvis du har 500 besøg om dagen, så ville jeg sandsynligvis ikke bekymre mig for meget om optimering, index'es og lignende. Du vil formodenligt kunne hente laaangt mere ved at slå zip-komprimering til for webserveren, optimere din HTML-kode og den slags ting.

Jeg kender til en webserver, der kørte på en 200 Mhz MIPS cpu og 64Mb RAM leverede over 100.0000 sider om dagen.

Hvis du har performance problemer med under 5000 queries om dagen, er det din mysql installation, der er noget i vejen med.
Avatar billede jinxit Nybegynder
25. juli 2003 - 21:05 #22
arne_v > måske ikke oplagt men særdeles effektiv :o)

...og MySQL understøtter index only scans, men kun for nummeriske domains.

Quote "In some cases a query can be optimised to retrieve values without consulting the datafile. If all used columns for some table are numeric and form a leftmost prefix for some key, the values may be retrieved from the index tree for greater speed."

Link http://www.mysql.com/doc/en/MySQL_indexes.html
Avatar billede arne_v Ekspert
25. juli 2003 - 21:11 #23
Jo.

Men feltet er hverken numerisk eller bliver retrievet.
Avatar billede jinxit Nybegynder
25. juli 2003 - 21:12 #24
...så er der stadigvæk plads til forbedringer :o)
Avatar billede webcreator Nybegynder
25. juli 2003 - 21:40 #25
Tak for svar :)
Nu vil jeg gerne bede om lidt svar.
Avatar billede arne_v Ekspert
25. juli 2003 - 21:42 #26
Sådan et svar ?
Avatar billede arne_v Ekspert
25. juli 2003 - 21:43 #27
Eller vil du gerne have uddybet noget f.eks. X * INSERT -> 1 * INSERT + (X-1) * UPDATE ?
Avatar billede webcreator Nybegynder
25. juli 2003 - 21:45 #28
Nej, det var et svar som det du gav først, hehe :-)

Tak for de uddybende kommentare. Jeg forstod ikke det hele, men jeg fik trodsalt en del ud af det alligevel. Med tiden bliver jeg forhåbentligt bedre til MySQL. Synes i hvertfald det går fremad :-)
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