Aantal queries per pagina belastend voor de server?
Ik heb even snel een vraagje. Stel ik heb een site waar je je CV kunt maken. Op die site moet ergens een totaaloverzicht staan van het CV dat je dan hebt samengesteld. Ik moet dan ongeveer 5 queries uitvoeren (personalia,cursussen,opleidingen,werkervaring,etc...).
Code (php)
1
$query = mysql_query("SELECT * FROM Opleidingen WHERE idGebruiker='".$_SESSION['idGebruiker']."'");
Als er nou 5 of 10 rijen staan, heeft dat merkbaar invloed op de server? Stel je hebt zo'n 100 mensen online die daarmee bezig zijn? Dus:
5 * 5 * 100 = 2500 queries
5 * 10 * 100 = 5000 queries
Heeft dat veel invloed op zo'n server?
Corrigeer me even als ik ernaast zit :)
Uiteraard heeft het invloed. 2 queries zijn meer belastend voor de server dan 1. Of 2 ook al een probleem is voor de server is een ander verhaal. Wanneer het 'te veel' wordt ligt natuurlijk aan veel meer zaken. In elk geval is het altijd een goed idee om te proberen het aantal queries zo laag mogelijk te houden. Aangezien er altijd een punt is waarop de load te hoog wordt voor de server. Hoe minder queries per pagina aanroep, hoe langer het duurt voor je het punt bereikt waarop de server om valt.
5 queries x 5 rijen x 100 bezoekers = 500 queries.
Het aantal rijen kan je niet zomaar in je berekening opnemen. Overigens is het zo dat het aantal rijen een kleinere invloed zal hebben dan het aantal queries.
Wat ik echter vermoed is dat je die 5 queries toch kan verminderen. Ik ga er vanuit dat die queries min of meer allemaal hetzelfde gebruiken. Dan zou je JOINS kunnen gaan gebruiken. Een iets grotere query zal wellicht iets meer uitvoeringsduur vragen, maar zal minder tijd vragen dan 5 aparte queries.
Toevoeging op 21/08/2012 10:47:48:
Tot slot nog kleine toevoeging. Aks je een beetje of wat degelijke host hebt, 5000 queries lukt wel nog aardig hoor. Doe is voor 'de fun' een loopje met 5000 queries. Gaat relatief snel als je hosting in orde is :-)
Elke querie die je uitvoert bevat een stukje overhead, nl. communicatie tussen client(PHP) en server(database). Dus ja je moet het aantal queries beperken tot het minimum.
Ik zie: het aantal PM's; Alle actieve leden; laatste tutorials, laatste reacties forum; laatste reacties scripts/tutorials, ... en uiteraard de content van dit topic.
Allemaal aparte query's. En ik heb ze zeker niet allemaal opgenoemd.
Ik bedoel maar ... ik denk dat het meestal wel meevalt. mySQL is ontworpen om dit soort dingen aan te kunnen.
Alleen even kanttekening. Het is niet omdat je 'queries' als het ware kan zien dat ze ook effectief allemaal zijn uitgevoerd. Al vermoed ik in het geval van phphulp dat ze allemaal uitgevoerd worden. Grotere sites gaan vaak echter werken met caching.
Bijvoorbeeld het aantal online leden zou je om de 5min kunnen ophalen en cachen. Wat dus relatief veel queries bespaart als je veel bezoekers hebt. Hetzelfde zou je met nog een aantal queries kunnen doen. Bijvoorbeeld actieve topics. Het is geen ramp als dat 5 minuten zou achterlopen. Hetzelfde met PM's, recente reacties, ... Wat ook altijd kan is cachen totdat je weet dat er een wijziging is. (zou bijvoorbeeld prima kunnen bij laatste scripts)
Maar... in dit geval spreek je echt al over relatief grote websites. (en dat is phphulp naar mijn mening nog niet)
Een thuis server draait alles op 1 machine, of dit nu een pc of server is, is niet relevant. Daar draai je op zijn minst: Apache HTTP Server, MySQL Server en in sommige situaties een Mail server.
Dit betekend dat er uiteraard veel harder gewerkt moet worden door de hardware, aangezien hier overal de zelfde processor, geheugen, data bussen, etc gebruikt wordt.
In een bedrijfs server is dit een heel ander verhaal. Daar heeft Apache HTTP server minimaal 1 fysieke server, MySQL server heeft minimaal 1 fysieke server en de Mail server heeft minimaal 1 fysieke server. Dat betekend dat de load van de hardware al verdeeld is over 3 fysieke servers wat jij thuis op 1 pc of server doet.
Tevens met de virtualisatie technieken van tegenwoordig zoals VMware heb je misschien wel 1 virtuele server van elk, die verspreid zijn over 6 fysieke servers per virtuele server. Dat is letterlijk een fysieke server bijprikken en koppelen in VMware, dit werkt zonder problemen en downtime in een 100% up and running situatie.
Maar de gedachtegang is altijd goed zo, let op je queries waar het minder kan ook zeker doen. Het is niet alleen rekenkracht, maar ook slijtage, stroom, hitte (airco kosten) en onderhoudskosten die gereduceerd worden door efficient om te gaan met PHP, MySQL en andere server side applicaties.
Voor de gemiddelde kleine man schilt dit niet zo veel, maar voor grote bedrijven waarvoor ik ook werk schilt dit al snel honderdduizenden euro's per jaar! Door puur efficient te werken, en optimaal gebruik te maken van de nieuwe technieken en slim programmeren.
Ergo, probeer het aantal queries te beperken daar waar kan. Het helpt altijd.
Erwin H op 21/08/2012 12:57:58:
Alle antwoorden zijn helemaal waar
Whoohooo Alles is goed!! De leeraar heeft gesproken!! ;) haha :D
Personalia:
Naam,
Adres,
Etc...
Opleiding:
Niveau,
Schoolnaam,
Diploma
Kan dat allemaal in 1 query? Zoja, is dat sneller dan in 2 verschillende queries te doen?
Bijvoorbeeld
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$query = mysql_query("SELECT Naam, Adres, Etc FROM Personalia WHERE idGebruiker='".$_SESSION['idGebruiker']."' LIMIT 1");
while ($row = mysql_fetch_assoc($query)){
echo "Naam:".$row['Naam']."<br>
Adres:".$row['Adres']."<br>
Etc:".$row['Etc'];
}
$query = mysql_query("SELECT Niveau, Schoolnaam, Diploma FROM Opleiding WHERE idGebruiker='".$_SESSION['idGebruiker']."'");
while ($row = mysql_fetch_assoc($query)){
echo "Niveau: ".$row['Niveau']."<br>
Schoolnaam: ".$row['Schoolnaam']."<br>
Diploma: ".$row['Diploma']."<br><br>";
}
?>
$query = mysql_query("SELECT Naam, Adres, Etc FROM Personalia WHERE idGebruiker='".$_SESSION['idGebruiker']."' LIMIT 1");
while ($row = mysql_fetch_assoc($query)){
echo "Naam:".$row['Naam']."<br>
Adres:".$row['Adres']."<br>
Etc:".$row['Etc'];
}
$query = mysql_query("SELECT Niveau, Schoolnaam, Diploma FROM Opleiding WHERE idGebruiker='".$_SESSION['idGebruiker']."'");
while ($row = mysql_fetch_assoc($query)){
echo "Niveau: ".$row['Niveau']."<br>
Schoolnaam: ".$row['Schoolnaam']."<br>
Diploma: ".$row['Diploma']."<br><br>";
}
?>
Kunnen de queries hierboven samengevoegd worden tot 1?
Dan kun je toch oplossen met JOIN's.
Meten is weten is ook van toepassing in ICT, doe een benchmark test. Belast de server met weinig, meer en veel queries en ga meten. Het is duimzuigerij om te zeggen 1 of 2 of 3 queries per pagina is teveel..... Hoe efficient zijn de queries, zijn er full table scans bij of is alles op index en nog beter op unique index scan. Thuisserver, bedrijfsserver, virtuele servers allemaal leuk verhaal maar zegt niks. Je moet meten (onder andere explainen) en je queries optimaliseren dan ben je pas goed bezig.
Chris NVT op 21/08/2012 13:43:36:
Dan kun je toch oplossen met JOIN's.
Ik heb 1 rij nodig van personalia maar 4 rijen van opleidingen. en toen? kan dat ook met een JOIN?
Toevoeging op 21/08/2012 14:01:21:
John D op 21/08/2012 13:48:09:
Thuisserver, bedrijfsserver, virtuele servers allemaal leuk verhaal maar zegt niks.
LOL, kinkt als weinig ervaring in de bedrijfs sector, voornamelijk grote bedrijven!
Jij test door weinig, meer en veel queries te draaien? Serieus ja? Jij wordt zeker op uurtarief ingehuurd?
Voor dit soort tests gebruik je netwerk/poort monitoring software en eventueel zelfs hardware. Dit doe je niet door onnodige queries te maken, maar door bestaande queries aan te passen wanneer je ziet dat er veel netwerk activiteiten zijn op dwe MySQL servers/poorten.
Voor de hobbiesten is er leuke netwerk monitoring software beschikbaar, gratis en/of open source. Voor bedrijven worden er proffesionele software en hardware gebruikt.
Met andere woorden
Personalia:
Rij 1: Albert, Adres, Etc..
Opleidingen:
Rij 1: Basisschool, Schoolnaam, Diploma behaald
Rij 2: HAVO, Schoolnaam, Diploma niet behaald
Rij 3: MAVO, Schoolnaam, Diploma behaald
Rij 4: MBO, Schoolnaam, Diploma nog niet behaald
Al die rijen wil ik in 1 query ophalen, kan dat met een JOIN?
Albert de Wit op 21/08/2012 14:02:25:
Ik volg het niet helemaal, mijn kennis met SQL is zeer beperkt. Ik probeer de 2 queries van hierboven in 1 te doen.
Met andere woorden
Personalia:
Rij 1: Albert, Adres, Etc..
Opleidingen:
Rij 1: Basisschool, Schoolnaam, Diploma behaald
Rij 2: HAVO, Schoolnaam, Diploma niet behaald
Rij 3: MAVO, Schoolnaam, Diploma behaald
Rij 4: MBO, Schoolnaam, Diploma nog niet behaald
Al die rijen wil ik in 1 query ophalen, kan dat met een JOIN?
Met andere woorden
Personalia:
Rij 1: Albert, Adres, Etc..
Opleidingen:
Rij 1: Basisschool, Schoolnaam, Diploma behaald
Rij 2: HAVO, Schoolnaam, Diploma niet behaald
Rij 3: MAVO, Schoolnaam, Diploma behaald
Rij 4: MBO, Schoolnaam, Diploma nog niet behaald
Al die rijen wil ik in 1 query ophalen, kan dat met een JOIN?
Albert je maakt hier toch 2x een while loop? eerst voor je persoons gegevens (ondanks dit maar 1 persoon is zie gebruikers_id). Daar heb je geen while loop voor nodig, dus die kun je al weglaten.
Verdiep je eens in de verschillende JOIN's die er zijn, en hoe ze precies werken. Dit gaat stukken makkelijker dan het voordoen.
Hier een mooie link om te beginnen.
Gewijzigd op 21/08/2012 14:06:19 door Chris PHP
Ja dat kan ook met een JOIN, dit houdt echter wel in dat je de personalia 4x krijgt.
Je geeft eigenlijk een verkeerd voorbeeld dit is het verschil tussen 1 of 2 queries.
Over het algemeen zou je kunnen stellen, als je in while lus van een result van een querie een andere querie aanroept, dit sowieso via een JOIN kan, en dan dus te veel queries uitvoert.
SQL Beginnershandleiding::Selecteren uit meerdere tabellen: JOINS
En John D, alsjeblieft... :|
En John D, alsjeblieft... :|
Gewijzigd op 21/08/2012 14:16:34 door Write Down
Ger van Steenderen op 21/08/2012 14:11:33:
Albert,
Ja dat kan ook met een JOIN, dit houdt echter wel in dat je de personalia 4x krijgt.
Ja dat kan ook met een JOIN, dit houdt echter wel in dat je de personalia 4x krijgt.
En dat wil ik juist voorkomen.
In het resultaat krijg je die 4x, dat wil niet zeggen op je pagina, dat heb je zelf in de hand.