Te veel CPU gebruik

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

Pagina: 1 2 volgende »

Steff   an

Steff an

04/07/2006 21:04:00
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 01/01/1970 01:00:00 door Steff an
 
PHP hulp

PHP hulp

17/11/2024 11:57:23
 
Klaasjan Boven

Klaasjan Boven

04/07/2006 21:22:00
Quote Anchor link
Ik vind je QUERY wel wat vreemd:


SELECT
ster,
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 != ''

ik snap het renamen niet waarom noem je de tabellen niet gewoon zo? Renamen doe je met name bij functies als SUM() en COUNT() ed En je vraagt alles met * dat neemt ook veel rekenkracht van de CPU
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
 
Steff   an

Steff an

04/07/2006 21:25:00
Quote Anchor link
Dit heb ik gedaan, omdat ik bij het maken van de tabellen niet nagedacht heb over dubbele namen. Dus 'naam' komt 2 keer voor, in twee tabellen.
 
Klaasjan Boven

Klaasjan Boven

04/07/2006 21:28:00
Quote Anchor link
En moet je naam en plaatsen niet aan elkaar knopen?
Zo krijg je toch bij elke naam alle plaatsen?

EDIT ik zie het zo voor me dat je bij elke naam weet welke plaats erbij hoort dus dat in de tabel namen een veld voorkomt met plaat_id.
en in de tabel plaatsen komt deze natuurlijk ook voor en je voegt iets toe aan je QUERY als:

AND
plaatsen.plaats_id=namen.plaats_id
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
 
Steff   an

Steff an

04/07/2006 21:32:00
Quote Anchor link
Volgens mij heb jij niet mijn hele sql:
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 != ''
 
Klaasjan Boven

Klaasjan Boven

04/07/2006 21:46:00
Quote Anchor link
Je hebt gelijk het staat er wel in. Dan blijft alleen de * over
 
Steff   an

Steff an

04/07/2006 22:01:00
Quote Anchor link
Wat ik gedaan heb is het volgende:

- De achternaam regexp verwijderd, Jelmer zei dat dit een CPU vreter is.
- MID(geboortedatum...) is verwijderd.

Ook heb ik wat 'parse time' testen gedaan. Voor deze aanpassingen was de gemiddelde parse tijd vijf seconden, na deze aanpassingen ligt deze tijd ver onder de één seconde.

Edit:
De tijd loopt weer erg voor 8-9 minuten
Gewijzigd op 01/01/1970 01:00:00 door Steff an
 
Klaasjan Boven

Klaasjan Boven

04/07/2006 22:16:00
Quote Anchor link
@Steffan ik zie niet dat Jelmer dat zei LOL
 
Steff   an

Steff an

04/07/2006 22:17:00
Quote Anchor link
Via IRC op

/server irc.chat4all.org
/join #phphulp

:P:P
 
Jan Koehoorn

Jan Koehoorn

04/07/2006 22:21:00
Quote Anchor link
Je gebruikt een hele reeks AND's na elkaar met zomaar ineens een OR ertussen. Dat is vragen om moeilijkheden. Een OR tussen een serie AND's zorgt er meestal voor dat de hele expressie altijd TRUE is dus levert altijd het maximale aantal resultaten.

Verder gebruik je de * operator die, zoals gezegd, niet aan te raden is. De MID funktie op een datum loslaten is ook niet slim. Er zijn in MySQL heel handige datumfuncties die je beter kunt gebruiken. Zie de handleiding.
 
Steff   an

Steff an

04/07/2006 22:24:00
Quote Anchor link
De hele MID functie is verwijderd, dus dat zijn al twee dingen.

De operator * zal ik veranderen.

En wat betreft die datum functies, dat is nu wat lastiger. Dat datums worden namelijk opgeslagen als varchar, maar verander ik nu ook.


Misschien verander ik de hele database-structuur wel, maar daar moet ik eens goed voor gaan zitten. Dat doe ik niet in deze hitte.
Gewijzigd op 01/01/1970 01:00:00 door Steff an
 
Jan Koehoorn

Jan Koehoorn

04/07/2006 22:35:00
Quote Anchor link
Steffan:
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.
 
Klaasjan Boven

Klaasjan Boven

04/07/2006 22:51:00
Quote Anchor link
@JAN voor de OR gebruikt hij haakjes toch?
 
Jelmer -

Jelmer -

04/07/2006 23:12:00
Quote Anchor link
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?
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

05/07/2006 00:25:00
Quote Anchor link
/me loves Jan zijn befaamde preformance-testjes!
/me vindt ze ronduit geweldig!
 
Zero Dead

Zero Dead

05/07/2006 09:13:00
Quote Anchor link
@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...
Gewijzigd op 01/01/1970 01:00:00 door Zero Dead
 
Roy Bongers

Roy Bongers

05/07/2006 09:51:00
Quote Anchor link
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.
 
Steff   an

Steff an

05/07/2006 10:20:00
Quote Anchor link
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
Gewijzigd op 01/01/1970 01:00:00 door Steff an
 
Eris -

Eris -

05/07/2006 10:32:00
Quote Anchor link
Als vaste bezoeker moet je weten dat wij hier niets sluiten...
 
W W

W W

05/03/2007 16:20:00
Quote Anchor link
Quote:
 
Steff   an

Steff an

05/03/2007 16:57:00
Quote Anchor link
Uhm... oké..

Arjan, mag die nu wel dicht? :P
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.