Database optimalisatie: de Inventis MySQL talk
Geregeld staat er een stevige project op de planning waar een nog stevigere database achter hangt, het is logisch dat je hier niet mee omgaat zoals een eenvoudig project qua database structuur. Maar wat als je merkt dat je website de eerste groeipijnen ondervindt, wat als je merkt dat de website niet meer zo snel was als voorheen? Via deze blogpost en de talk die ik gegeven heb wil ik even mijn zicht geven over database optimalisatie.

Verwacht geen geavanceerde nieuwe technologieën, verwacht geen exotische configuraties, ik wil echter even terugkeren naar de basis via deze blogpost. De focus die ik wil leggen is vooral om ervoor te zorgen dat je via enkele eenvoudige investeringen je website terug op volle snelheid kan laten draaien. Meer info of een voorbeeld kun je in de PDF onderaan vinden.
De software
Vaak draait een wat oudere website op een eveneens oudere versie van MySQL. Dankzij de constante verbeteringen die de MySQL community aanbrengt is de database echter steeds sneller aan het worden en zullen problemen die je hebt op een oudere versie al voor een deel opgelost zijn dankzij bv. verbeteringen aan de interne query analyzer. De MySQL versie updaten is echter spijtig genoeg niet steeds mogelijk. Dat neemt niet weg dat wanneer het wel mogelijk is, het een zeer goede en makkelijke manier om de performance wat op te krikken.
De queries
Een groot verschil tussen MySQL 4 en 5 is de zeer fel verbeterde interne analyzer, maar toch baat het om het aantal resultaten zo snel mogelijk, zo klein mogelijk te houden. Vaak denken we dat dit reeds het geval is, maar de ervaring leert ons dat het toch steeds nuttig is om de meest gebruikte queries even opnieuw te bekijken. Een zware query die op elke pagina zal uitgevoerd worden verbeteren zal meteen je website sneller laten aanvoelen en de load van de server doen zakken onder de goede omstandigheden. De manier van queries schrijven maakt dus zeker uit.
De indexen
Een goede index op een tabel kan de performance met een factor doen verbeteren, maar vaak worden er extra indexen gelegd of is het niet duidelijk voor de developer waar net de index moet gelegd worden. In de meeste gevallen leg je het best indexen op elke foreign key en op velden waar je vaak op gaat filteren. Hou er wel rekening mee dat een index op een Text veld geen gewone index mag zijn, maar een Fulltext index. Algemeen gezien moet je op velden met een vaste maximumwaarde (Int, Varchar, ...) een gewone index leggen en op flexibele velden een fulltext index. Uiteraard moet je zuinig omspringen met indexen, te veel indexen zijn ook niet goed!
Slot
Natuurlijk zijn dit redelijk eenvoudige optimalisaties, soms zal het sneller maken van een website flink wat werk vragen. Gelukkig kunnen we in de meeste gevallen toch op redelijk eenvoudige manier al een groot verschil maken. De pdf met de volledige tekst kun je hier downloaden. Mocht je vragen, opmerkingen of tips hebben, laat ze gerust achter in de comments!



3 reacties tot nu toe
Rob Frederix zei 2 jaar geleden:
Tim Schoef zei 2 jaar geleden:
Gerry Put zei 2 jaar geleden:
Wat ook heel belangrijk is de grote van je dataveld. Als je bijvoorbeeld een naam gaat opslagen gebruik dan niet een text veld. Maar limiteer dit met een varchar(60) en gebruik zeker nooit uit gemak een varchar(256) want dit wordt immers aanzien als een text veld (dus een blob). In concreet houdt dat in dat op het moment MySQL een sort moet doen op die table, die table altijd zal wegschrijven op disk wat onnodige I/O voorzaakt. Anders doet hij dit gewoon in geheugen.
Een goede keuze van Storage engine is natuurlijk ook heel belangrijk. Soms is het gewoon beter van de iets tragere (maar relationele) InnoDB te gebruiken ipv MyISAM, natuurlijk voor veel websites is het beter om MyISAM te nemen puur voor de snelheid die het heeft.
Horizontale schaling zoals extra slave servers bijzetten is ook altijd een mogelijkheid om snel een verhoging te hebben van performance (met of zonder mysql-proxy).