Использование звездочки в выбранных запросах

Я слышал, чтобы не использовать * (звездочку), но назовите нужные мне поля. Это из-за проблем с производительностью или соображений безопасности? может кто-нибудь сказать хорошие аргументы для этого?

Так что не

SELECT * FROM users WHERE name='John';

но вместо этого

SELECT name FROM users WHERE name='John';

Ответ 1

Самая большая причина не использовать звездочки в производственных запросах - изолировать ваш код, отличный от SQL, от изменений в схеме базы данных или сделать это более трудным для того, чтобы такие изменения остались незамеченными.

Например, если ваш код запрашивает звездочку, ожидающую name в первом столбце и address во второй, если схема изменит добавление третьего столбца перед двумя, которые вы уже читаете, ваш код получит новый столбец вместо имен, а также поместит имена вместо адресов. Хуже всего то, что он сделает все это без сбоев: пользователи просто видят данные мусора.

Напротив, запрос с явно именованными столбцами мог бы либо получить правильные столбцы, несмотря на изменение схемы, либо сломаться, если необходимый столбец был удален или переименован. Это сразу укажет на источник проблемы, что облегчит вам исследование и устранение проблемы.

Ответ 2

Это работа. Когда вы SELECT *, вы извлекаете каждое поле в таблице. Если вы SELECT name, вы выбираете только поле имени. Может быть намного меньше данных для передачи с сервера БД на приложение при выборе только полей, которые вам нужны.

Ответ 3

SELECT * означает SELECT ALL из вашей таблицы. Он выберет все столбцы.

но если вы укажете, чтобы выбрать только некоторые столбцы, как в вашем запросе

SELECT name --- > будет выбран только столбец имен

Ответ 4

потому что, если вы выберете *, вы получите все столбцы для этого запроса, что переводит на использование более высокой памяти для вашего набора данных, а не просто на получение столбцов, которые вам нужны.

Ответ 5

Мне это больше похоже на вопрос здравомыслия, удобочитаемости и здравого смысла.

Когда вам нужно только name - почему бы не написать его явно?
Это сделает ваш запрос более информативным для читателя.

Но когда я вижу, что плохие разработчики пишут дюжины имен полей явно только для того, чтобы следовать этой "производительности" дерьмо - это заставляет меня болеть.

Важное примечание из комментариев:
Очень важно написать код, который не зависит от порядка или количества полей в запросе. Поэтому просто используйте *, выберите ассоциативный массив, и ваш код никогда не сломается по такой глупой причине.

Для моих скромных тестов у меня есть какая-то разница. 0,0002 доли секунды.
Ну, если такое различие является определенным узким местом для вашего приложения - идите для явного ввода полей (хотя для синтаксического анализа потребуется больше времени для анализа вашего запроса, hehe:)
Тем не менее, в моей сфере деятельности проблемы производительности начинаются с разницы не менее 0,001s. Поэтому я не стал бы беспокоиться.