Лучшая практика: разместить нагрузку на SQL или веб-сервер?

Я вебмастер для крупного американского университета. У нас на сайте много запросов, которые я создавал и отвечал за последние 7 лет или около того. Я встраивал все более сложные функции в наш веб-сайт, и всегда практиковался в том, чтобы возложить как можно больше бремени программирования на наш многопроцессорный сервер Microsoft SQL - используя хранимые процедуры, представления и т. Д., И заполняя в том, что нельзя сделать с помощью PHP, ASP или Perl с веб-сервера IIS. Оба сервера являются очень мощными и способными машинами. Поскольку я занимался этим в одиночку так долго, что никто не мог провести мозговой штурм, мне любопытно, подходит ли мой подход к ситуациям с еще более высокой нагрузкой, которые будут в будущем.

У меня такой вопрос: лучше ли брать на себя больше нагрузки на сервер SQL, используя вложенные операторы SELECT, представления, хранимые процедуры и агрегатные функции, или мне нужно выполнять несколько простых запросов и обрабатывать их с помощью серверной компиляции? временные скрипты вроде PHP? Продолжать держать или придумать лучший способ?

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

Спасибо за ваш совет и вклад.

4 ответа

Решение

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

Нет никакого смысла в том, чтобы сервер базы данных отправлял 1000 строк и использовал PHP для их фильтрации, если было бы достаточно предложения WHERE или предложения GROUP. Не оптимально вызывать базу данных для добавления двух целых чисел (SELECT 5+9 работает нормально, но php может сделать это сам, и вы сохраните туда и обратно).

Возможно, вы захотите взглянуть на масштабируемость: какие части вашего приложения могут быть разделены на несколько процессов? Если вы все еще используете 2 слоя (script & db), там есть много возможностей для масштабирования. Но всегда начинайте с узкого места в первую очередь.

Некоторые примеры: размещение статического содержимого в CDN, использование кеширования для ваших страниц, чтение о nginx и memcached, использование nosql (mongoDB), рассмотрение шардинга, рассмотрение репликации.

Мое мнение таково, что обычно (в основном) лучше всего отдавать предпочтение тому, чтобы веб-серверы выполняли обработку. Два момента:

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

Второй момент, который я хотел бы сделать, - это оптимизация запросов. Это будет во многом зависеть от запросов, которые вы используете, и от базы данных. Когда я впервые начал работать с базами данных, я попал в ловушку создания сложных SQL-запросов с несколькими JOIN, которые выбирали именно те данные, которые мне нужны, даже если они были из четырех или пяти разных таблиц. Я рассуждал, что "для этого существует база данных - давайте заставим ее выполнять тяжелую работу"

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

Во-первых, вы можете проверить, есть ли какая-либо нагрузка, которая может быть полностью удалена с помощью кэширования на стороне клиента (.js, .css, статического HTML и изображений) и использования таких технологий, как AJAX, для частичного обновления экранов - это будет снять нагрузку с веб-серверов и серверов sql.

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

Я стараюсь делать как можно больше за пределами базы данных, рассматривая вызовы базы данных как дорогие / трудоемкие.

Например, при выполнении выбора пользовательской таблицы с полями name_given и name_family я мог бы заполнить запрос, чтобы получить столбец с именем full_name, созданный путем конкатенации. Но такого рода вещи можно легко сделать в модели на вашем языке сценариев на стороне сервера (PHP, Ruby и т. Д.).

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

Другие вопросы по тегам