Я использую PostgreSQL 9.3 и имеют следующие таблицы (упрощенно показаны только соответствующие поля):Производительность: LEFT JOIN против подзапрос
SITES:
id
name
...
DEVICES:
id
site_id
mac_address UNIQUE
...
Учитывая наличие mac_address
конкретного устройства, и я хочу, чтобы получить детали связанных site
. У меня есть следующие два запрос:
Использование LEFT JOIN:
SELECT s.* FROM sites s
LEFT JOIN devices d ON s.id = d.site_id
WHERE d.mac_address = '00:00:00:00:00:00';
Использование подзапроса:
SELECT s.* FROM sites s
WHERE s.id IN (SELECT d.site_id FROM devices d WHERE d.mac_address = '00:00:00:00:00:00');
Какой из этих двух запросов будет иметь лучшую производительность по сравнению с бесконечно растущей базой данных? Я всегда склонялся к опции LEFT JOIN
, но было бы интересно узнать, как производительность обеих ставок на большом наборе данных.
Возьмите 'EXPLAIN' и проверьте его сами. – zerkms
Или еще лучше: используйте 'explain analysis'. Плюс: если у вас есть несколько строк в 'устройствах 'с тем же mac_address, то эти два утверждения не делают то же самое. –
Я думаю, что они даже генерируют разные результаты, поэтому они несравнимы. – Caramiriel