Сократить количество запросов к БД

Рейтинг: 1Ответов: 3Опубликовано: 08.04.2015

Достался мне проект, да не простой, а запутанный - во время выполнения он обращается к таблице 70-120 раз, в зависимости от типа запроса. И это не считая других служебных запросов типа настроек и прочего.
Помимо проблемы рефакторинга этого хлама, встаёт другая, более интересная: данные нужны именно во время работы, нельзя подгрузить в конце, в начале тоже, т.к. записей в таблице несколько тысяч, никогда не знаешь какие 100 понадобятся в этот раз.
Кэширование тоже не то, чтобы подходит - все записи довольно регулярно обновляются и на удивление равномерно используются.
Все эти запросы вида: SELECT something FROM table WHERE id = integer.

Как это разрулить и оптимизировать хотя бы немного?
Благодарю за внимание.

Ответы

▲ 3Принят

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

▲ 1

Из простого - сделать индекс по id и перенести таблицу (если mysql) в память. Из правильного (на мой взгляд) - Redis/memcache для хранения данных. Несколько тысяч записей это очень мало для современных объемов памяти, легко поместится.

▲ 1

В запросах по первичному ключу нет никаких проблем. Прикручивать монгу, реддис, мемкеш не имеет смысла в случае сложного разветвленного процесса. Первая оптимизация - это дедубликация запросов. В сложных процессах, написанных кривыми руками бывает. Второе - оптимизация алгоритма. Иногда, когда обсасываешь задачу долго, приходит понимание того, что если сделать процесс немного наоборот, то получится проще и быстрее. Т.е. пока вы не разберетесь основательно - зачем это было так сделано, вы не сможете проводить оптимизацию. Берите редактор и рисуйте процессы, алгоритмы, логику. Легкого пути не будет. Ну или если у вас есть все спеки - напишите заново (: З.Ы. я надеюсь с индексами и настройками бд у вас все впорядке?