25. juli 2003 - 20:25Der 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 ?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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
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).
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);
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.
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.
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.
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."
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 :-)
Synes godt om
Ny brugerNybegynder
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.