SELECT * повертає всі колонки, навіть ті, що коду не потрібні. На маленьких таблицях різниці немає, але проблеми з'являються з ростом:
- Зайві дані через мережу й у пам'ять. Колонка
body TEXTчиpayload JSONна сотні кілобайтів, вибрана для списку із 50 заголовків, множить обсяг у рази. - Не працює покривний індекс. Якщо запиту потрібні лише
idіstatus, які є в індексі, база могла б не звертатися до таблиці. З*мусить. - Крихкість. Додали колонку - і запит раптом повертає більше даних; у
INSERT ... SELECT *чиUNIONзміна схеми ламає запит. - Читабельність. З коду не видно, які дані реально використовуються.
-- Для списку статей
SELECT id, title, published_at FROM posts ORDER BY published_at DESC LIMIT 20;
У Laravel Eloquent за замовчуванням робить select *. Для важких таблиць варто явно обмежувати колонки: Post::select(['id', 'title', 'published_at']), а для зв'язків - with('author:id,name').
Коли * нормальний: разові запити в консолі, EXISTS (SELECT * ...) (там колонки не читаються взагалі), і COUNT(*), який з вибором колонок узагалі не пов'язаний.