Hoi,

Kan iemand mij het verschil in snelheid uitleggen tussen een JOIN en een SUBQUERY?
Ik moet hier namelijk veel mee werken, maar ik heb geen idee welke sneller is.
Ik heb al wat gegoogeld, maar daar word ik ook niet wijzer van.

Alvast bedankt
@Marc

Een idee is om het dan zelf te gaan testen:
- Schrijf een bepaalde query tussen 2 tabellen uit met een JOIN en haal dezelfde informatie ook op middels een Subquery.
- Voer deze query in in (bijvoorbeeld) PHPmyAdmin en voer hem uit.
- Hou de tijden bij en druk op de "refresh knop"
- Doe hetzelfde voor beide query's

-> Om het nog beter te maken: Zet beide query's in een for lus en laat ze (ik noem maar wat) 20 keer uitvoeren.

Laat PHP berekenen hoe lang die over 20x die query doet, en dat op je scherm zetten.

Om het nog eerlijker te maken kan je deze beide loopjes ook nog in een for lus zetten om deze vergelijking 20x te doen. Je hebt dan een redelijk beeld van wat er sneller is.
En/Of gebruik EXPLAIN ook even. Daarin zit vaak ook nuttige informatie.
Ik heb het getest op een tabel met 467*30 records. Ik heb ook gelijk even gekeken wat het tijdsduurverschil is bij een CROSS JOIN en een INNER JOIN.
Hieronder de resultaten:
INNER JOIN 
SELECT l.`naam`, n.`negeer` 
FROM `leden` AS l
INNER JOIN `negeer` AS n
ON n.negeer = l.id
WHERE n.`id` = 10

CROSS JOIN -- 0.01 SECONDE SNELLER
SELECT l.`naam`, n.`negeer` 
FROM `leden` l, `negeer` n 
WHERE n.`id` = 10 AND n.`negeer` = l.`id`

------------------------------------------------------
Tijd: 0.12277102470398
SELECT `naam`
FROM `leden`
WHERE id IN (
SELECT `negeer`
FROM `negeer`) 

Tijd: 0.03038477897644
SELECT DISTINCT `naam`
FROM `leden` AS l
INNER JOIN `negeer` AS n
ON l.id = n.negeer 

Tijd: 0.031938076019287
SELECT DISTINCT `naam`
FROM `leden`, `negeer`
WHERE leden.id = negeer.negeer


Dus voor diegene die dit ook willen weten:
Een subquery is duidelijk langzamer dan een JOIN. Gebruik dus indien mogelijk een JOIN IPV een SUBQUERY.

Ik kan natuurlijk niet zeggen dat de test zo super betrouwbaar is, maar er is wel een duidelijk verschil zichtbaar :)


Ik had hetvolgende scriptje gebruikt (ongeveer hetzelfde als bij een tutorial hier):
<?
include 'dbconnect.php';
function get_microtime(){
	list($usec, $sec) = explode(" ", microtime());
	return((float)$usec + (float)$sec);
}
$sql = "SELECT DISTINCT `naam`
FROM `leden`, `negeer`
WHERE leden.id = negeer.negeer";
for($i = 0; $i < 20000; $i++){
	$start = get_microtime();
	mysqli_query($conn, $sql);
	$stop = get_microtime();
	$tijd = $stop - $start;
	echo 'Tijd: ' . $tijd;
	echo '<br />';
}
?>
Misschien is de test niet 100% correct, maar het grote verschil in beide query's zegt al genoeg!

Reageren