MySQL subselect sebessége

Már egy egyszerű weboldalnál is gyakran előfordul, hogy a kapcsolódó adatokat egy subselect állítja elő, így csökkentve a lekérések számát az oldal generálásakor. Csak épp nem mindegy, hogy hogyan is csináljuk. A MySQL sebességét nagyon erősen az határozza meg, hogy hány sorral kell dolgoznia. Ezért is nagyon fontos, hogy mindig a lehető legkevesebb sorral dolgozzon az adatbázis, akkor is, ha csak egy köztes folyamatról van szó. Az alábbi 2 query ugyanazt az eredményt adja, csak épp tízezerszeres (!) sebességkülönbséggel:

A gyors változat:

SELECT t.name, t.converted_path, t.thumbnail_path, t.file_id, (
	SELECT GROUP_CONCAT(DISTINCT(d.oid) ORDER BY d.dispname)
	FROM log_usage_file_daily l2
	LEFT OUTER JOIN mod_screen_displaydevices d ON d.oid = l2.device_id
	WHERE l2.file_id = t.file_id
) AS device_list
FROM (
	SELECT 
		DISTINCT (l.file_id) AS file_id,
		f.name,
		f.converted_path,
		f.converted_type,
		f.converted_mime,
		f.type,
		f.source,
		f.thumbnail_path
	FROM log_usage_file_daily l
	LEFT OUTER JOIN mod_screen_files f ON f.id = l.file_id
	WHERE l.company_id = :company_id AND l.dt BETWEEN :start AND :end AND l.file_id IS NOT NULL AND f.id IS NOT NULL
	ORDER BY f.name
) t

A lassú (és sokkal elterjedtebb) változat:

SELECT 
	DISTINCT (l.file_id) AS file_id,
	f.name,
	(
		SELECT GROUP_CONCAT(DISTINCT(d.oid) ORDER BY d.dispname )
		FROM log_usage_file_daily l2
		LEFT OUTER JOIN mod_screen_displaydevices d ON d.oid = l2.device_id
		WHERE l2.file_id = f.id
	) AS device_list,
	f.converted_path,
	f.converted_type,
	f.converted_mime,
	f.type,
	f.source
FROM log_usage_file_daily l
LEFT OUTER JOIN mod_screen_files f ON f.id = l.file_id
WHERE l.company_id = :company_id AND l.dt BETWEEN :start AND :end AND l.file_id IS NOT NULL AND f.id IS NOT NULL
ORDER BY f.name