Een website die ik gemaakt hebt ik gehost bij een redelijk bekende hosting. Nu kreeg ik vandaag een e-mail, dat een bepaald script 50% CPU gebruikt van de MySQL-server.
Wat kan ik als oplossing gebruiken? De query is:
SELECT *, naam.id as pers_id, plaatsen.naam as plaatsnaam, MID(geboortedatum,7,4) as gjaar FROM naam, plaatsen WHERE achternaam REGEXP '^(achternaam)$' && voornaam like '%' AND naam.plaats = plaatsen.id AND ((MID(geboortedatum,7,4) <= 2000 AND MID(geboortedatum,7,4) >= 1880) OR (MID(geboortedatum,1,4) <= 2000 AND MID(geboortedatum,1,4) >= 1880)) AND geboortedatum != ''
Er is vast en zeker een beter en snellere manier voor deze query. Waar waarschijnlijk de meeste CPU vreter zit is: MID(geboortedatum,1,4)
De query haalt uit drie of soms vier verschillende tabellen zijn gegegens.
Steffan
Nu was ik toch eigenlijk wel benieuwd naar het verschil tussen =, LIKE, MATCH AGAINST en REGEXP. Misschien weer tijd voor een van jouw befaamde preformance-testjes Jan?
((MID(geboortedatum,7,4) <= 2000 AND MID(geboortedatum,7,4) >= 1880) OR (MID(geboortedatum,1,4) <= 2000 AND MID(geboortedatum,1,4) >= 1880))
Maar zo rekent hij wel 4keer MID uit.
Er staat het volgende in:
achternaam REGEXP '^(achternaam)$' && voornaam like '%'
Waarom gebruik je hier && en op alle andere plaatsen AND? En wat heeft get voor zin om like '%' neer te zettten, want zo haalt hij alles op, onafhankelijk van wat er wel of niet in de voornaam staat.
Edit: Het kan zijn dat bij NULL de rij niet geslecteerd word...