Databases vs. files
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?
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
en dan zal ik er nog wel een aantal vergeten ;-)
Gewijzigd op 26/09/2005 06:59:00 door Jan Koehoorn
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.
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.
Probeer zoiets eens met textfiles???
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.
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 :))
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.
Elwin
- 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.
En dan is er nog SQL ....
Gewijzigd op 08/10/2005 10:25:00 door Martijn B