Использование * в запросе ВЫБОРА [дубликат]
Возможный Дубликат:
Что быстрее/лучше? ВЫБЕРИТЕ * или ВЫБЕРИТЕ столбец 1, столбец 2, столбец 3 и т.Д.
В настоящее время я переношу приложение, написанное на MySQL3 и PHP4, на MySQL5 и PHP5.
При анализе я обнаружил несколько SQL-запросов, в которых используется "выбрать *из имени таблицы", даже если в PHP обрабатывается только один столбец (поле). Таблица содержит почти 60 столбцов и имеет первичный ключ. В большинстве случаев используется только столбец id который является первичным ключом.
Повысится ли производительность, если я буду использовать запросы, в которых имена столбцов явно указаны вместо *? (В этом приложении есть только один метод, для которого нам нужны все столбцы, а все остальные методы возвращают только подмножество столбцов)
7 answers
Обычно считается хорошей практикой брать только то, что необходимо. Особенно, если сервер базы данных находится не на том же компьютере, извлечение всей строки приведет к замедлению запросов, поскольку требуется больше данных для передачи по сети на потребляющий компьютер. Поэтому, если полная строка содержит около 100 тыс. данных, и вам нужен только идентификатор, который намного меньше, вы, конечно, получите более быстрые результаты.
В качестве общего совета по оптимизации запросов используйте инструкцию EXPLAIN, чтобы увидеть насколько дорогостоящим будет запрос.
"Преждевременная оптимизация - корень всего зла". Дональд Кнут.
Никогда не задавайте таких вопросов, как Will there be any performance boost?
. Но задавайте только такие вопросы, как "У меня есть определенное узкое место. Как я могу это устранить?"
В 99 % наших приложений это "улучшение" было бы нецелесообразным. Как и многие другие улучшения, основанные на мечтах , а не на профилировании и реальных потребностях.
Будет ли какое-либо повышение производительности, если Я использую запросы, в которых имена столбцов явно упоминаются вместо *? - ДА
Если и сколько вы выиграете, зависит от конкретного случая, но, по крайней мере, в тех случаях, когда вам нужен только столбец id, вам следует исправить SQL.
В дополнение к уменьшению сетевого трафика (при отправке бесполезных данных), база данных может получить доступ к нескольким столбцам, которые вам действительно нужны, просто используя индексы, вообще не обращаясь к таблице. Это значительно ускорило бы процесс.
Единственным возможным недостатком является увеличение числа различных операторов SQL, которые сервер должен процесс (и более сложный код с вашей стороны).
Нет - это повлияет на производительность, но до тех пор, пока в схеме нет больших двоичных объектов/блоков, это будет незначительно (если вы не получите доступ к своей базе данных через модем на 300 бод) - большая часть работы, выполняемой базой данных, заключается в определении строк, соответствующих предложению WHERE - однако его (IMHO) плохая практика программирования для использования SELECT *
C.
Да. Извлекайте только те столбцы, которые вам нужны. Это не только может повысить производительность, но и предотвратит непреднамеренное нарушение кода. Рассмотрим этот запрос:
ВЫБЕРИТЕ * ИЗ вкладки ПРИСОЕДИНЯЙТЕСЬ к вкладке... ЗАКАЗАТЬ ПО colX
Их запрос работает сегодня, когда только в tabA есть colX, но если вы измените схему и добавите colX в tabB, запрос будет отменен.
Конечно, использование псевдонимов таблиц для всех полей также поможет предотвратить поломку.
-Крип
Да. Если вы получаете больше данных, чем вам нужно, их необходимо считывать с диска, передавать между MySQL и PHP и т. Д. что, вероятно, займет больше времени.