2010-06-05 2 views
1

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

В настоящее время этой странице требуется 18 (это право восемнадцать) попадает на базу данных. Я уже использую объединения, и некоторые из запросов UNIONed минимизируют поездки в db. Моя локальная машина-разработчик может справиться с этим (страница не медленная), однако я чувствую, что если я выпущу это в дикую природу, количество запросов будет быстро перегружать мою базу данных (MySQL).

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

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

[Редактировать]

Просто чтобы прояснить, я уже сделал «очевидные» вещи, как с помощью (одиночные и составные) индексов для полей, используемого в запросах. То, что я еще не сделал, - запустить анализатор запросов, чтобы узнать, оптимальны ли мои индексы и т. Д.

+0

Эти вещи не являются «очевидными». Без анализа запросов это просто слепая стрельба. То же самое, что и ваши вопросы о производительности: без профилирования результатов это просто пустой блаб. Производительность не может быть оптимизирована с использованием определенного рецепта или магического номера. Это * процесс *. Что делать. –

ответ

0

18 дБ запросов, вероятно, немного излишним, если это не какой-то сложный портал; хотя не зная на 100%, что страница и серверный код конца, трудно судить.

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

Для первого убедитесь, что ваш внутренний интерфейс поддерживает общий пул соединений с БД (я предполагаю, что вы используете PHP, поэтому у меня нет практических советов, но у Java и Perl есть способы достижения этого); и, конечно же, убедитесь, что одна загрузка страницы повторно использует одно и то же соединение БД для всей страницы.

Для последних (меньше запросов), смотрите в:

  • Пакетирующий все запросы в один большой запрос с несколькими наборами результатов

  • денормализация своих наборов результатов через JOIN и UNION, как вы уже делаете

Кроме того, считают, имеющие средний уровень между вашим веб-приложение и БД (кэше, или сервер приложений, который кэширует данные).

Однако я должен сказать, что практически не советовал делать что-либо из вышеперечисленного, пока вы не протестируете приложение против prod-сервера и тестов и не найдете медленные точки с использованием тестов и профилирования.

UPDATE: Для того, чтобы ответить на скептик в комментариях, вот некоторая информация о стоимости соединений, в частности, как связанный Ot MySQL

http://mysql-dox.net/Sams-MySQL.Database.Design.and/0672327651/ch14lev1sec3.html (Google cache)

+0

Вы уверены, что эти «соединения», как вы его называете, действительно влияют на что-либо? –

+0

@Col. См. Мое обновление – DVK

+1

OP открывает только одно соединение –

0

Ваш подход абсолютно неправильный.
В этих «поездках на дБ» отмечается плохо.

И ваши attemts минимизировать количество запросов любой ценой может привести вас к медленному запросов и производительности катастрофы

+1

Совершенно неправильно? Нет ничего плохого в том, чтобы убедиться, что вы делаете так мало поездок в db, насколько это возможно? Я согласен с тем, что делать это «любой ценой» - это плохая идея, но я бы не сказал, что его подход полностью ошибочен ... –

+0

@ Не пытайтесь оптимизировать * число * запросов, а не * качество *. Попытка оптимизировать что-либо без профилирования результатов - это неправильный подход. Вот почему это называется «совершенно неправильно». Когда-либо слышал слово * профилирование *, а? –

+1

Вы должны учитывать все аспекты производительности при попытке настроить приложение/базу данных. Включая количество запросов, загруженных на загрузку страницы, и любое профилирование, которое вы сделали. –

0

Вы ВОССТАНОВЛЕНИЕ той же информации на несколько страниц вообще? Если вы, возможно, сможете передавать эту информацию со страницы на страницу, а не запрашивать DB каждый раз.

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

0

18 вопросов не являются проблемой при условии, что они быстрые и эффективные.

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

Смежные вопросы