hoe "slim" is MySQL?
Stel je hebt een database met daarin 20 miljoen producten, allemaal met een eigen uniek artikelnummer. De artikelnummers beginnen met 3 letters gevolgd door een reeks cijfers, bijvoorbeeld ABC303293202 of XTH110393234. De artikelnummers staan niet op alfabetische / numerieke volgorde in de database.
Stel je hebt een index op het artikelnummer en je wil een bepaald artikelnummer opzoeken... hoe gaat MySQL dan te werk en hoe "slim" is MqSQL?
Stel het artikelnummer dat je wilt opzoeken is QEM98223132.
Hoe gaat MySQL vervolgens te werk? Ik kan me voorstellen dat ie via de index eerst gaat kijken of er een artikelnummer is dat begint met de letter Q... maar wat dan? Gaat ie vervolgens kijken of er een artikelnummer is dat begint met QE en vervolgens QEM, QEM9, QEM98 enzovoorts... net zo lang totdat ie een match heeft? Of werkt het zo niet?
Gewijzigd op 15/09/2011 16:05:25 door Ozzie PHP
Normaal staat een index gesorteerd. Dus daar is dat nummer snel gevonden. En die index wijst dan naar het volledige record.
Dus die index is eigenlijk een 2e tabel ofzo? Maar stel dat er 100.000 records zijn die beginnen met een Q gaat ie dan in die index tabel al die 100.000 records doorlopen net zolang totdat ie een match vindt of is MySQL zo slim dat ie ziet dat het nummer met een QEM begint en begint ie dus ook vanaf QEM te zoeken? Ik snap niet zo goed hoe dat werkt.
Als je daarin de zaakjes netjes ordent (=indexeert), kun je heel snel de juiste kaart vinden. Geen index of op de verkeerde gegevens, dan zoek je wat langer...
Er zijn diverse zoekmethodes die, indien een index aanwezig, het één voor één zoeken overbodig maken. Een simpel voorbeeldje is: Pak steeds de middelste en kijk hoger of lager. Bij géén index zullen alle records moeten worden bekeken.
Oké, bedankt!
http://en.wikipedia.org/wiki/B-tree
Er is nog veel meer informatie te vinden over dit onderwerp, Google er eens op.
Ps. de optimizer van MySQL is vrij dom/beperkt, maar een BTREE gebruiken in een simpele query is geen probleem.
Klink ik nu stom of kun je niet gewoon reguliere expressie in je sql gebruiken?
Hoe bedoel je Tim?
Tim van Norde op 16/09/2011 12:27:14:
Klink ik nu stom of kun je niet gewoon reguliere expressie in je sql gebruiken?
Dat kan, maar wat wil je daarmee bereiken? De performance van jouw queries zal er niet beter van worden, MySQL kan dan geen index meer gebruiken.