Простой вопрос: SELECT *
дороже, чем выбор некоторых полей, это может быть даже значительно. Меньше данных, нет доступа к таблице, если все поля в индексе. Нет маршалинга от значения поля базы данных до переменной языка программирования.
Вложенные подзапросы и соединения имеют свое право.
SELECT * FROM customers where customers_id NOT IN (SELECT customers_id FROM orders)
можно переписать как:
SELECT *
FROM customers c
WHERE NOT EXISTS(SELECT *
FROM orders o
WHERE o.customers_id = c.customers_id)
MySQL заявляет, что он может лучше оптимизировать EXISTS, поскольку рекурсивная оптимизация выбора теперь содержит информацию о c.customers_id.
Хотя лучше всего было бы присоединиться к @StilesCrisis, хотя я сомневаюсь, что это правильно. (Хотя я не выпил свою первую чашку кофе за день.)
КСТАТИ. EXISTS(SELECT *
на самом деле не резервирует место для всех полей, и это нормально.