NoSQL vs. MySQL: wat zijn eigenlijk de voordelen?

Door Sam de Poorter, back-end developer
9 juli 2014 - 3446 x bekeken - Categorieën: Tech

Bij de developers van E-sites is databasemanagementsysteem (DBMS) MySQL eerste keus. En dit hanteren we dan ook bij vrijwel al onze projecten. In grote lijnen zijn we daar tevreden over, al merken we met de diversiteit aan projecten (zowel in schaal als complexiteit) de bekende tekortkomingen. Denk hierbij aan het aanhouden aan een vaste structuur (kolommen) voor elke rij, performanceproblemen bij big-data en het moeilijk kunnen schalen van de architectuur. In NoSQL worden deze problemen (native) aangepakt, maar het is niet alleen daarom een sterke collectie van opkomende DBMS'en. Bedrijven als LinkedIn, FourSquare, Ebay, MTV, Cisco en Craigslist maken er al dankbaar gebruik van. Facebook en Google trekken dit nog breder en ontwikkelen eigen varianten (in het geval van Facebook: Cassandra). Maar wat maakt NoSQL eigenlijk zo interessant?

Diversiteit in NoSQL DBMS'en

NoSQL is een noemer voor de collectie aan DBMS'en met een paar fundamentele kenmerken. Waaronder: high performance, geen afgedwongen structuur voor je data en een makkelijk te schalen architectuur. De invulling voor deze punten verschilt per NoSQL DBMS, die inmiddels ruim vertegenwoordigd zijn. Er zijn grote verschillen tussen deze varianten, dus oriënteer je goed voordat je hierin een keuze maakt. Enkele voorbeelden waar vaak verschil in voorkomt:

  • Ondersteuning van transacties
  • Ondersteuning van indexen en de diverse mogelijkheden daarin
  • Ondersteuning van triggers
  • Het aanbieden van unieke kenmerken, zoals couchDB dat bijvoorbeeld version-control mogelijk maakt
  • Focus op performance, of juist de nadruk op functionaliteit
  • Type NoSQL DBMS (zie hieronder).

Om je te oriënteren is het artikel van Kristof Kovacs een goed begin. Hierin wordt opgesomd wat de belangrijkste kenmerken van de populairste NoSQL DBMS'en zijn. Daarnaast staat hierin opgenomen wat veelal de toepassingen zijn, zodat je kan kijken wat aansluit bij jouw doeleinde. Ook hier zal je opvallen dat er diverse NoSQL-typen zijn (zie figuur 1), zie de volgende opsomming:

  • Column: Accumulo, Cassandra, HBase
  • Document: Clusterpoint, Couchbase, MarkLogic, MongoDB
  • Key-value: Dynamo, FoundationDB, MemcacheDB, Redis, Riak, FairCom c-treeACE
  • Graph: Allegro, Neo4J, OrientDB, Virtuoso

 

Figuur 1: Types in NoSQL, key-value, document en graph

REDIS

Redis (type key-value) staat bekend als een 'persistend memcache' alternatief, maar is zeker niet beperkt tot die rol. Redis heeft als belangrijkste voordelen:

  • Persistence to disk: je data gaat niet verloren, niet omdat de server uitvalt maar ook niet omdat je geheugen volloopt
  • Sterke datatypen zoals hashes, sorted sets, lists en meer zijn ondersteund
  • Ondersteunen van Transacties
  • Publish en Subscribe functionaliteit
  • Waarden tot 512 MB toegelaten, bij memcache is dat 1 MB
  • Redis is bliksemsnel, in eigenlijk alles. Benchmarks liegen er niet om en benchmarks over Memcache tonen vaak aan dat Redis bijna net zo snel, of soms zelfs sneller is dan Memcache. De performance is net als bij Memcache wel erg afhankelijk van het beschikbare geheugen en netwerk, maar niet de CPU.

High performance
Zowat het speerpunt van de marketing: NoSQL is inderdaad erg snel, ook bij big data. Een belangrijke reden hiervan is het ontbreken van relaties tussen objecten en het niet ondersteunen van transacties. We mogen niet vergeten dat MySQL al sinds 1970 in ontwikkeling is en deze ook een goede focus heeft op performance. In combinatie met het ontbreken van een afgedwongen vaste structuur heeft NoSQL qua performence zeker een aantal strepen voor.

Ontbreken van een afgedwongen structuur
Beeld je in dat je een webshop ontwikkelt zoals Wehkamp. Verschillende producten hebben uiteenlopende kenmerken, een jurk heeft hele andere eigenschappen dan een DVD-speler. Je hebt dus een structuur nodig die hiervoor geschikt is, zoals die van een document-based NoSQL DBMS. Persoonlijk vind ik de vergelijking met een XML-document sprekend. Je kan hierin zelf naar hartenlust nodes en subnodes opnemen.

Omdat je per document de kolommen definieert, zijn er extra voordelen. In het geval van je order, kun je direct al je product-, klant- en leverdata direct opnemen. Dit neemt de noodzaak tot relaties weg en zorgt ervoor dat je met een enkele query je entiteit met alle benodigde data kan ophalen. Verder houdt het je database-design simpel en overzichtelijk, wat we natuurlijk alleen maar toejuichen. 

Er ligt een sterk verband tussen deze vrije structuur en de bovengenoemde performance. Als je met dezelfde opzet en dataset in MySQL en NoSQL gaat benchmarken, krijg je niet de significante verschillen waar je op hoopt. Als je goed gebruik maakt van de nieuwe mogelijkheden met de NoSQL-structuur, bereik je forse winst. De opzet kun je vergelijken met denormaliseren in relationele DBMS'en (RDBMS), zoals bij MySQL. Maar in NoSQL is dit native opgenomen in de opzet van je data en ontzettend makkelijk te implementeren.

Schaalbaarheid
NoSQL is breed inzetbaar, toepasbaar in mobiele apps en tot aan de enorme volumes van big-data. Dit is te danken aan de (horizontale) schaalbaarheid. Bij verticaal schalen moet je denken aan hardware-upgrades van je huidige server, bij horizontaal schalen aan een node erbij prikken. Bijna elke NoSQL DBMS houdt hier rekening mee door globale caching te onderhouden, data-center aware te zijn en een prima vorm van automatisch fail-overs te implementeren.

Indexen
Veel van de MySQL-indexen worden ondersteund. Denk aan Primary-, Secondary-, Compound-(multi-column) en text-indexen. Deze vormen worden ook ondersteund op arrays of objecten, in objecten zelf.

Text-indexen worden dermate goed ondersteund dat NoSQL DBMS'en als mongoDB en elasticsearch prima alternatieven zijn voor het populaire Solr. Je ziet bij mongoDB buiten de goede performance, dat het ook het zoeken op relevantie ondersteunt: dus dat je 'gewicht' kan koppelen aan velden. Hiermee kun je bijvoorbeeld aangeven dat een woord in de titel dubbel zo belangrijk is dan woorden die gewoon ergens voorkomen in de tekst. Als de gezochte termen of losse woorden voorkomen in de gekozen velden van je index, wordt dit een rekensom van gewicht x aantal voorkomen, per veld. Op deze manier kun je sorteren op relevantie, met het bijkomend voordeel dat dit in je real-time dataset zoekt. Een partij als Ebay past dit slim toe, wat terug te vinden is in de auto-aanvulfunctionaliteit in de zoekbalk.

MongoDB biedt nog meerdere unieke index-typen aan die we niet kennen vanuit MySQL, waaronder TTL- en geospatial-indexen. Ttl staat voor time-to-live, je kunt dus bij een object opgeven hoelang deze opgenomen moet worden in je dataset. Dit kan handig zijn wanneer je bijvoorbeeld een vorm van logging bijhoudt in je database. Dit voorkomt dat je alsnog cronjobs moet oprichten, om je dataset op te schonen. Geospatial houdt in dat het zoeken op geolocaties wordt ondersteund, wat neerkomt op een compound-index op je long- en latitute veld in je document. Dit brengt nieuwe query mogelijkheden met zich mee. Je geeft in mongoDB een beginlocatie in (ook een long- en latitute waarde) en een radius in kilometers, zodat je de gewenste objecten terug ontvangt. Dit is door complexe query's ook beschikbaar in MySQL. Maar NoSQL biedt dit native, waardoor het al veel sneller is. En daarnaast maakt het toepassen van een correcte index ook een enorm verschil.

Buiten index-typen, zijn er ook index-opties. Als eerste noem ik 'spatial', wat betekent dat NULL values niet opgenomen worden in je index. Dit komt je performance ten goede en bespaart veel ruimte in je index. Een verdere interessante optie is 'background-creation' dat ervoor zorgt dat tabellen niet worden gelocked. Zodat je index kan worden aangemaakt. Wel zo fijn als je dataset uit miljoenen of zelfs biljoenen records bestaat!

API-georiënteerd

Gelukkig zijn er al prima drivers beschikbaar voor de populairste opties. Zoals Redis, MongoDB, CouchDb en Cassandra, om op te nemen in je PHP-code. In deze clients worden de CRUD-operaties als losse methods behandeld, waarmee indirect het SQL-injection principe vervalt. Iets dat MySQL nog altijd als securityrisk meeneemt. De drivers zijn ook veel meer OOP gericht, waar je met documentatie en auto-aanvulling in je IDE vlug mee uit de voeten kan.

GridFS

GridFS (FS staat voor filesystem) is een techniek die wordt toegepast door MongoDB, voor de opslag van data (documenten of zelfs files als je deze in de DB opslaat). In figuur 2 zie je hoe de data gepartioneerd wordt in blokken van 256 KB. Deze blokken worden gedefragmenteerd opgeslagen, zodat ze snel samen opgehaald kunnen worden.

 

Figuur 2: MongoDB partioneert zijn data in segmenten van 256KB. 

Het voordeel van het partioneren is dat niet altijd alle data-opgehaald of zelfs benaderd hoeft te worden. Als jij alleen enkele velden van een document selecteert, hoeft niet alles ingelezen te worden. Alleen de partities met de data die je zoekt. Dit voordeel wordt nog een stuk groter bij bijvoorbeeld grote media-bestanden (zie figuur 3 voor een voorbeeld van een video). Dit lijkt op de opzet van YouTube: er wordt een minuut aan data opgehaald en vanuit daar kan steeds verder worden gebufferd. Dit zorgt ervoor dat de gebruiker niet onnodig hoeft te wachten en dat er niet onnodig veel data over het netwerk gaat. Ook de meta-data van een media-bestand wordt apart opgeslagen, zodat hier makkelijk op gezocht kan worden zonder het complete bestand in te lezen.

Figuur3: Segmenten inlezen van een video-file met GridFS.

Conclusie

Ik ben op zoek gegaan naar de voordelen van NoSQL ten opzichte van MySQL Hierbij stel ik dat NoSQL scherp inspeelt op de gebieden waar MySQL minder sterk uit de verf komt, zonder daar veel voor in te leveren. Op het gebied van performance, schaalbaarheid en het niet verplicht aanhouden van een vaste data-structuur, lijkt noSql geen concurrentie te hebben. Daarnaast bieden de diversie noSql DBMS'en elk hun eigen voordelen en vaak nieuwe functionaliteit, wat complexe workarounds in mySql overbodig maakt. MySql blijft echter heer en meester op gebied van data-consistentie, relaties en transacties.

Ik ben in elk geval erg enthousiast en ervan overtuigd dat NoSQL meer toepassing en aansluiting gaat vinden in de toekomst en ook meer grond zal winnen. Ook bij ons intern!

 

 

Wij zoeken collega's!

Wil jij deel uitmaken van een bureau met een passie voor technologie? Kijk dan snel naar onze openstaande vacatures!

E-sites Group lanceert open usabilitylab voor eyetracking onderzoek

Door E-sites

Met het introduceren van een open usabilitylab voor eyetracking onderzoek, faciliteren fullservice internetbureau E-sites en online marketing bureau… - Lees meer

Lees verder