Использование * в запросе ВЫБОРА [дубликат]


Возможный Дубликат:
Что быстрее/лучше? ВЫБЕРИТЕ * или ВЫБЕРИТЕ столбец 1, столбец 2, столбец 3 и т.Д.

В настоящее время я переношу приложение, написанное на MySQL3 и PHP4, на MySQL5 и PHP5.

При анализе я обнаружил несколько SQL-запросов, в которых используется "выбрать *из имени таблицы", даже если в PHP обрабатывается только один столбец (поле). Таблица содержит почти 60 столбцов и имеет первичный ключ. В большинстве случаев используется только столбец id который является первичным ключом.

Повысится ли производительность, если я буду использовать запросы, в которых имена столбцов явно указаны вместо *? (В этом приложении есть только один метод, для которого нам нужны все столбцы, а все остальные методы возвращают только подмножество столбцов)

Author: Community, 2010-03-18

7 answers

Обычно считается хорошей практикой брать только то, что необходимо. Особенно, если сервер базы данных находится не на том же компьютере, извлечение всей строки приведет к замедлению запросов, поскольку требуется больше данных для передачи по сети на потребляющий компьютер. Поэтому, если полная строка содержит около 100 тыс. данных, и вам нужен только идентификатор, который намного меньше, вы, конечно, получите более быстрые результаты.

В качестве общего совета по оптимизации запросов используйте инструкцию EXPLAIN, чтобы увидеть насколько дорогостоящим будет запрос.

 10
Author: Gordon, 2010-03-18 10:57:58

"Преждевременная оптимизация - корень всего зла". Дональд Кнут.

Никогда не задавайте таких вопросов, как Will there be any performance boost?. Но задавайте только такие вопросы, как "У меня есть определенное узкое место. Как я могу это устранить?"

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

 4
Author: Your Common Sense, 2010-03-18 11:25:06

Будет ли какое-либо повышение производительности, если Я использую запросы, в которых имена столбцов явно упоминаются вместо *? - ДА

 2
Author: ant, 2010-03-18 10:53:23

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

В дополнение к уменьшению сетевого трафика (при отправке бесполезных данных), база данных может получить доступ к нескольким столбцам, которые вам действительно нужны, просто используя индексы, вообще не обращаясь к таблице. Это значительно ускорило бы процесс.

Единственным возможным недостатком является увеличение числа различных операторов SQL, которые сервер должен процесс (и более сложный код с вашей стороны).

 1
Author: Thilo, 2010-03-18 10:58:14

Нет - это повлияет на производительность, но до тех пор, пока в схеме нет больших двоичных объектов/блоков, это будет незначительно (если вы не получите доступ к своей базе данных через модем на 300 бод) - большая часть работы, выполняемой базой данных, заключается в определении строк, соответствующих предложению WHERE - однако его (IMHO) плохая практика программирования для использования SELECT *

C.

 1
Author: symcbean, 2010-03-18 10:59:26

Да. Извлекайте только те столбцы, которые вам нужны. Это не только может повысить производительность, но и предотвратит непреднамеренное нарушение кода. Рассмотрим этот запрос:

ВЫБЕРИТЕ * ИЗ вкладки ПРИСОЕДИНЯЙТЕСЬ к вкладке... ЗАКАЗАТЬ ПО colX

Их запрос работает сегодня, когда только в tabA есть colX, но если вы измените схему и добавите colX в tabB, запрос будет отменен.

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

-Крип

 1
Author: Krip, 2010-03-18 11:30:57

Да. Если вы получаете больше данных, чем вам нужно, их необходимо считывать с диска, передавать между MySQL и PHP и т. Д. что, вероятно, займет больше времени.

 1
Author: Tom Haigh, 2016-11-28 09:22:14