Hallo,

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
Steffan schreef op 04.07.2006 22:24
De datums worden namelijk opgeslagen als varchar, maar verander ik nu ook.


Datums sla je op als een DATE, of als een DATETIME veld. Als je een datum als een string opslaat, kan MySQL er helemaal niets meer mee.
@JAN voor de OR gebruikt hij haakjes toch?
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?
/me loves Jan zijn befaamde preformance-testjes!
/me vindt ze ronduit geweldig!
@klaasjan

Inderdaad:

((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...
Die hele regex kan er volgensmij zelfs uit.

achternaam REGEXP '^(achternaam)$'

achternaam = achternaam

Dat staat er eigenlijk volgensmij.
En die voornaam like % kan er idd ook uit.
Ik bouw de hele qeury opnieuw en de bijhoordende tabellen. Ik heb deze query een jaar geleden gemaakt en heb nu heel wat meer (My)SQL kennis.

@Roy
achternaam REGEXP '^(achternaam)$'
is omdat dat (twee)achternaam een echte ingevulde achternaam is, die ook wildcards kan bevatten.

[edit]Topic kan dicht[/edit]
Als vaste bezoeker moet je weten dat wij hier niets sluiten...
Uhm... oké..

Arjan, mag die nu wel dicht? :P

Reageren