30. juni 2006 - 10:57Der er
14 kommentarer og 1 løsning
Simpel hurtig database
Hej Jeg er interesseret i en hurtig database-server.
Database-designet vil være meget simpelt - lad os sige at der er kun 1 tabel med et par felter.
Tilgengæld vil der være mange - (og nu mener jeg ikke et par millioner) inserts og select i døgnet.
Jeg kunne forestille mig, at der eksisterer en simpel database-server (som mangler en række smarte sql-funktioner).
I første omgang ønsker jeg ikke store computere, clustering og andre smarte tricks...
Jeg har lavet nogle små forsøg (blot at indsætte rækker i det uendelige) på DB2 og postgres. De kan indsætte omkring 500 rækker i sekundet på min reference computer. Ja, og postgres dør efter nogen tid.
Har du et bud på en database, som kan klare følgende problem?
Du kan evt lave et testprogram, som blot indsætter række i databasen - hvor mange rækker (med 2k data) kan indsættes pr. sekund, og kan systemet kører efter et par døgn ?
Angaaende postgresql, har du saa husket at saette dine requests i en transaktion, saa du ikke har en transaktion per insert?
(Og ellers bliver du nok noed til at bruge noget lignende http://www.berkleydb.com/ men det er ikke en sql database. (Hvilke sprog skal du bruge den fra))
Det hjalp lidt med at fjerne autocommit på postgres (1000 inserts i sekundet mod 500 pr/sek tidligere), men stadigvæk bliver postgres efter 5 minutter "træt" - mit lille php-script får en timeout (celeon 2,5 GHZ, 1 GBytes ram, Linux, PHP).
DB2 kører fint med 650 insert pr. sek - men jeg synes det er noget i underkanten... (centrino 2 GHz, 2 Gbytes Ram, Win XP, Java).
Er du sikker paa at det ikke er php der bliver traet i stedet for postgresql? postgresql burde kunne overleve de insert uden problemer. Jeg har personligt ikke meget tiltro til den garbadge collection som php bruger.
Og i java med DB2, har du saa husket at kalde setAutoCommit(false) paa din connection? (Du skal saa selv kalde begin() og commit() paa din connection. Personligt vil jeg tro det er smart at koere med ca 1000 insert per transaktion, men jeg ved det ikke.
Og saa naturligvis bruge et preparedStatement til dine insert.
Nu ved jeg jo ikke hvad du er ved at lave, men er der nogle grund til at du ikke bare kan skrive direkte til en fil i stedet for en database? Det lyder som om det du er ved at lave er en form for log eller lignende.
Du har ret i, at jeg kan optimere på testprogrammet i java mod db2. Jeg bruger autocommit=false og jeg commit'er efter et passende antal. Men jeg bruger ikke preparedStatements denne gang - det er rigtigt, at det kan gang i processen.
Nu bruger jeg midlertid DB2 og java som reference-måling, da kunden formentlig vil bruge php/postgres eller C# og mssql (og ikke java/DB2). Jeg retter java-programmet (db2) så det bruger preparedStatements i næste hug - så kan jeg måske overbevise dem om, at man skal bruge java :-)...
Mit php-test-program kører dog med preparedStatements mod postgres - og det er også det som bekymrer mig lidt. Jeg har kun brugt php på en database-venlig måde tidligere (både mysql og postgres), så det kan godt være php giver problemer, når php bliver stress-testet.
Du har ret i, at man kan betragte det som værende en slags log. Men - vi skal også kunne søge i "loggen" parallelt med at der indsættes. Det er der for, at jeg kunne tænke mig en simpel rå database, som bare var hurtig til simple inserts og simple selects.
Det er derfor, at jeg gerne ser noget i retning af 10000 inserts pr. sek på en mindre maskine.
det er ganske rigtigt betydeligt hurtigere at bundte flere insert i en transaktion end at have en transaktion per insert, men det passer bare sjaeldent med applikations logikken !
Jeg tror at hvis du vil bruge SQL, saa er din eneste maade at opnaa 10000 inserts pr. sek er hvis du har en ren ram database. (Jeg mener mysql har en, men det kraever naturligvis at det hele kan ligge i ram, og det tyder det ikke paa det kan, med det output du skal bruge, saa laenge)
Men hvis jeg var dig, ville jeg bare skrive det hele i en fil.
Hvis man bruger et posix OS(Altsaa: Alt andet end windows) saa er der ikke noget problem i at et program laese fra en fil samtidig med at et andet program skriver til den.
hvis du skal have en billig loesning til mange insert saa vil jeg sige en almindelig PC med 4 WD Raptor (10000 RPM) SATA diske i RAID 1+0 og med MySQL som database og MyISAM tabeller
pointen er at MyISAM slet ikke bruger transaktions log, hvilket giver suveraen god insert at end performance
DB2 er hurtig på maskiner med god hardware (specielt mainframs).
Problemet ved at anvende en logfil er, at man får problemer med finde tingene igen (select where ... and .. and ... or ... and not ....). I princippet skal man opfinde sin egen database. Måske får man også brug for andre operationer som UPDATE og DELETE, hvorved fokus helt bliver fjernet fra det oprindelige problem.
Jeg har installeret postgres og php på min bærbare centrino 2Ghz, 2GBytes ram, 80GBytes disk. Og jeg har modificeret java-programmet og php-scriptene. Jeg vil køre nogle "store" stress-test, men ligenu er det for varmt for min stakkels pc - jeg vender tilbage med nogle resultater om nogle dage.
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.