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