Один большой запрос против множества маленьких?

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

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

Лучше иметь одну статическую функцию Client.getById, которая извлекает всю запись клиента, или несколько (Client.getNameById, Client.getMobileNumberById и т. д.), которые извлекают отдельные поля?

Если в одной записи много полей, и я в конечном итоге использую одно или два в текущем скрипте, все же лучше получить все и решить внутри приложения, что делать со всеми данными?

Я использую PHP и MySQL кстати.


person federico-t    schedule 24.03.2012    source источник
comment
Это зависит... под всем, что ты делаешь, ты подразумеваешь все, что требуется, верно? Какая у вас пропускная способность? Сколько у вас пользователей? Это все в одной серверной? Вниз по оптоволокну? Через мобильный интернет? Какова ваша задержка? Где ваши пользователи? Где ваши серверы? Насколько они сильны? Как они организованы? Сколько байт это много?...   -  person Ben    schedule 25.03.2012
comment
@Ben У тебя есть способности к абстрактному мышлению? Я спрашиваю, какой вариант лучше в общем случае. Приложение еще не выпущено, поэтому я не знаю   -  person federico-t    schedule 25.03.2012
comment
Да :-). @oded, верно, чем меньше обращений к базе данных, тем лучше, чем меньше передано байтов, тем лучше, но все вопросы остаются в силе; они повлияют...   -  person Ben    schedule 25.03.2012
comment
@Ben Вы правы, лучшая оптимизация, которую можно было бы сделать, - это фактически проверить, что является (являются) узким местом (узкими местами) в приложении, используя в конце концов информацию из реальной жизни, но в общем случае я думаю, что ответ Одеда правильный.   -  person federico-t    schedule 25.03.2012
comment
Если вы еще не сталкивались с ORM, настоятельно рекомендую взглянуть на проект Doctrine. Он автоматически связывает ваши классы с вашими таблицами и генерирует геттеры/сеттеры, поэтому вам даже не нужно думать об этом шаге. Зачем изобретать велосипед?   -  person Sam Selikoff    schedule 04.04.2013


Ответы (1)


Лучше иметь одну статическую функцию Client.getById, которая извлекает всю запись клиента, или несколько (Client.getNameById, Client.getMobileNumberById и т. д.), которые извлекают отдельные поля?

Да, это.

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

Если размер данных действительно настолько велик, что вы видите эффект, вы можете рассмотреть возможность извлечения определенных полей, которые вам нужны, в одном запросе (адаптируйте запросы к данным).

person Oded    schedule 24.03.2012
comment
Цитата имеет 2 альтернативные точки зрения, разделенные знаком «или». Да, это не совсем понятно. - person user3738936; 07.01.2020