Мы столкнулись с серьезными проблемами масштабирования для нашей интеллектуальной поисковой системы / агрегатора . Наша база данных содержит около 200 тысяч объектов. Судя по профилированию и новым реликвиям, большинство наших проблем может исходить из базы данных. Мы используем самую маленькую специализированную базу данных Heroku (Ronin).
Мы занимаемся индексированием и кэшированием . До сих пор нам удавалось решить наши проблемы путем интеллектуального сокращения вызовов базы данных и кэширования контента, но теперь даже это, кажется, подходит к концу. Мы постоянно спрашиваем себя, достаточно ли хорош наш код / конфигурация или мы просто не используем достаточно «аппаратного обеспечения».
Мы подозреваем, что решение для базы данных, которое мы покупаем у Heroku, может работать недостаточно. Например, простое подсчет (без объединений, без ничего) для 200 тыс. Элементов занимает около 250 мс. Это похоже на long время, хотя postgres известен своей плохой производительностью по счетам?
Мы также начали использовать поиск геолокации на основе широты / долготы. Оба столбца являются индексированными числами с плавающей точкой. Расчет расстояния требует довольно сложной математики, но мы используем очень хорошо рекомендованный гем geocoder
, который, как предполагается, может выполнять очень оптимизированных запросов. Даже геокодеру по-прежнему требуется 4-10 секунд для поиска, скажем, 40 000 объектов, возвращая только предел первых ближайших 10. Это снова звучит как долгое время , и все опытные люди, с которыми мы консультируемся говорит, что это звучит очень странно, снова намекая на производительность базы данных.
Так что в основном мы задаемся вопросом: что мы можем ожидать от базы данных? Может ли быть проблема? И что мы можем ожидать, если мы решим обновить?
У меня есть еще один вопрос: я прочитал здесь , что мы можем улучшить производительность, загрузив всю базу данных в память. Мы должны сами это настроить и если да, то как?
ОБНОВЛЕНИЕ ПОСЛЕДНЕГО ВОПРОСА:
Я получил это от людей из службы поддержки Heroku:
"Что это значит - иметь достаточно памяти (достаточно большой выделенный
база данных), чтобы сохранить ваш горячий набор данных в памяти. Это не то
вы должны сделать вручную, Postgres настроен автоматически использовать все
доступной памяти в наших специализированных базах данных.
Я посмотрел на вашу базу данных и похоже, что вы сейчас
использование около 1,25 ГБ ОЗУ, поэтому вы не увеличили использование памяти
еще. "
ОБНОВЛЕНИЕ НА ЧИСЛАХ И ЦИФРАХ
Хорошо, теперь у меня было время взглянуть на цифры и цифры, и я постараюсь ответить на следующие вопросы:
- Прежде всего, БД состоит из около 29 таблиц с множеством связей. Но в действительности большинство запросов выполняются в одной таблице (некоторые дополнительные ресурсы объединены, чтобы предоставить всю необходимую информацию для представлений).
- В таблице 130 столбцов.
- В настоящее время он содержит около 200 тыс. Записей, но активны только 70 тыс., Следовательно, все индексы создаются как частичные индексы в этом «состоянии».
- Все столбцы, которые мы ищем, проиндексированы правильно, и ни один из них не имеет текстового типа, и многие из них являются просто логическими значениями.
Ответы на вопросы:
- Хм, базовая производительность сложно сказать, у нас так много разных вариантов. Время, которое требуется, обычно варьируется от 90 мс до 250 мс, при выборе ограничения в 20 строк. У нас есть много подсчетов на одном столе от 250 до 800 мс.
- Хмм, ну, это трудно сказать, потому что они не сделают это.
- У нас около 8-10 пользователей / клиентов, одновременно выполняющих запросы.
- Загрузка нашего запроса: в отчетах базы данных новой реликвии говорится об этом за последние 24 часа:
throughput: 9.0 cpm, total time: 0.234 s, avg time: 25.9 ms
- Да, мы изучили планы запросов наших длительных запросов. Запросы подсчета являются особенно медленными, часто более 500 мс для довольно простого подсчета записей 70 КБ, выполненных в индексированных столбцах, с результатом около 300