Ik hoor/lees altiijd dat het sneller is om gegevens op te slaan in een database dan in tekstbestanden. Eerst las ik hier gewoon altijd een beetje overheen en geloofde ik het wel, alleen laatst zat ik ineens te denken: uiteindelijk schrijft die database die gegevens ook gewoon naar een bestand, dus waarom zou dat dan sneller zijn? Ik bedoel: als je dus een database-functie gebruikt, zet je eigenlijk alleen maar een extra laag tussen het opslaan in een bestand. Dus hoe kan het dan zijn dat dat sneller is?
De techniek erachter zou ik je niet kunnen vertellen Jordi, maar dat het sneller gaat weet ik wel.
Misschien heeft het iets te maken met het feit dat een database werkt met indices, waardoor records sneller te vinden zijn, bijv. als je er eentje wilt wissen.
Als je een textfile wilt bewerken, moet je hem eerst helemaal openen met fopen () om er iets mee te kunnen doen. Met een database hoef je alleen maar te connecten. Dus waarschijnlijk zit het snelheidsverschil hem niet in het wégschrijven, maar in het openen en het zoeken naar de juiste plek in het bestand.
Toen ik pas met PHP begon werkte ik meestal met platte tekstfiles. Meestal sloeg ik records dan op in een soort CSV formaat. Vooral als het aantal records groter werd dan 50 duurde het behoorlijk lang voordat een pagina geladen werd.
Behalve het snelheidsvoordeel heb je met een database natuurlijk nog andere voordelen, zoals:
1) een database is veiliger. Tekstfiles kun je zo uitlezen in de browser
2) een database is relationeel. Als je de tabellen handig indeelt komt elk stukje gegeven maar één keer voor
3) je beschikt over queries
In theorie is een database even snel als een text file. (Een database wordt ook als een text file opgeslagen in een database.)
Dit is echter allleen wanneer je de complete bestanden nodig hebt. En dat heb je bij een database nooit nodig. Daardoor is vaak veel sneller. Omdat gegevens op een snelere manier geslecteerd.
?Onbekende gebruiker
26-09-2005 14:28
Denk eens in het groot: Eén enkele tabel van 500 GB in een database die nog veel groter is. Hoe denk je zoiets in een tekstbestand neer te zetten? Maar nog belangrijker, hoe denk je zonder index hierin iets terug te vinden? (en dan wel graag binnen 14 dagen...)
Een database kun je niet vergelijken met een tekstbestand, het is véél meer dan alleen een bak met gegevens. Een database kan rekenwerk voor jou doen, vergelijkingen maken, controleren of data wel correct is, etc., etc.
In jouw webapplicatie heb je misschien een database met een paar honderd of paar duizend records, maar dat stelt helemaal niets voor in vergelijking met de databases die bij grote bedrijven en de overheid in gebruik zijn. Die betalen dan ook miljoenen per jaar aan licenties en personeel.
Leuk dat je zo'n vraag stelt, maar wees voorzichtig wanneer er een dba in de buurt is, die gaat helemaal uit zijn dak bij zo'n vraag!
Kijk verder eens op www.oracle.com of www-306.ibm.com/software/data/db2/
Ik wist trouwens ook al wel dat een database sneller was dan text-files en ook dat het meer doet en veiliger is enzovoorts. Ik vroeg me alleen af hoe het kon zijn dat het sneller is. Natuurlijk heb je indeces enzo, maar uiteindelijk staan die ook gewoon ergens in een bestand dat geopend moet worden toch?
Mijn redenering is eigenlijk een beetje als volgt (voor het selecteren van data):
PHP + text-files:
- PHP opent text-file (met fopen)
- PHP gaat op zoek naar de data die je wilt hebben
- PHP pakt die data
PHP + database:
- PHP maakt verbinding met database
- PHP zegt tegen database welke data nodig is (query)
- De database opent een bestand (want de data in dbs staat ook in bestanden)
- De database gaat op zoek naar de data die je wilt hebben
- De database pakt die data
- De database geeft de data terug aan PHP (dus PHP pakt de data)
Als je zo redeneert, waarom zou een database dan sneller zijn? Ik weet wel dat het zo is. Ik vraag me alleen af waarom. Er is vast iets mis met mijn redenering, maar ik weet zo snel even niet wat.
Is het ook niet zo dat (zover mogelijk) de index van databases gecached worden?
Probeer zoiets eens met textfiles???
?Onbekende gebruiker
08-10-2005 08:46
Heeft allemaal te maken met de index. Jij vraagt een record op met een sleutel 21.
De database ontvangt de opdracht en kijkt naar het getal. Het cijfer zit niet tussen de 0 en 10. Het eerste index bestand slaat hij dus over. Het tweede index bestand bevat data van 11 tot 21 en daar kan hij vinden waar hij het record wel kan vinden.
Een database is denk ik een soort Excel formaat.
Allemaal aparte rijen, waardoor het zoeken erg snel gaat.
Database werkt ook gewoon veel makkelijker als je er eenmaal aan gewend bent (ik kan niet omgaan met text-files, maar zeer goed met MySQL :))
Het is precies als Webmakerij zegt. Maar of het met 10 records gaat dat weet ik niet...
Ik heb geleerd dat een database engine de tabel door ttweeën deelt. Dan kijkt hij of het in groep A zit, zo ja, dan valt B weg. Zo nee, dan valt A weg.
Vervolgens wordt het overgebleven resultaat weer gedeeld door twee, zit het resultaat in deel X dan gaat de DB engine verder met X, anders met Y.
Zo wordt dus bij elke stap het aantal mogelijke records gedeeld door 2.
- Relaties tussen tabellen, met verschillende voorwaarden.
- Unieke kolom waardes.
- Locking van tabelen / records, als er 1 of meerder records worden aangepast dan kan een andere query deze niet aanpassen wel lezen. Dit is het grote snelheids verschil tussen MyISAM en InnoDB.
- Full text engine voor zoeken
- Makkelijk backups maken
In de meeste gevallen biedt een database veel meer voordelen dan een tekst bestand. Als je even een string wilt bewaren of een serialized iets dan is een tekst bestand sneller. Maar heb je entiteiten (gebruiker, sessies, orders, produkten) en daartussen relaties dan is dit niet te doen in tekst bestanden.