Настройка производительности PostgreSQL
Имейте в виду, что я новичок в мире sql/баз данных.
Я вставляю/обновляю тысячи объектов каждую секунду. Эти объекты активно запрашиваются через несколько секунд.
Какие основные вещи я должен сделать для настройки производительности моей (postgres) базы данных?
Ответы
Ответ 1
Это широкая тема, так что здесь много материала для чтения.
- EXPLAIN и EXPLAIN ANALYZE чрезвычайно полезны для понимания того, что происходит в вашем db-engine
- Убедитесь, что соответствующие столбцы проиндексированы
- Удостоверьтесь, что неулокальные столбцы не проиндексированы (вставка/обновление-производительность может снизиться, если слишком много индексов необходимо обновить).
- Убедитесь, что ваш postgres.conf настроен правильно
- Знайте, что такое work_mem и как оно влияет на ваши запросы (в основном полезно для более крупных запросов).
- Убедитесь, что ваша база данных правильно нормализована.
- VACUUM для очистки старых данных
- ANALYZE для обновления статистики (статистика для количества статистики)
- Постоянные соединения (вы можете использовать диспетчер соединений, например pgpool или pgbouncer).
- Понять, как построены запросы (объединения, подвыборки, курсоры)
- Кэширование данных (т.е. memcached) является опцией
И когда вы исчерпали эти параметры: добавьте больше памяти, более быструю дисковую подсистему и т.д. Аппаратное обеспечение имеет значение, особенно в больших наборах данных.
И, конечно же, прочитайте все остальные потоки в postgres/databases.:)
Ответ 2
Прежде всего, прочтите официальное руководство Рекомендации по производительности.
Запуск EXPLAIN во всех ваших запросах и понимание его вывода позволит вам узнать, как ваши запросы будут такими быстрыми, как они могут быть, и если вы должны добавлять индексы.
Как только вы это сделаете, я предлагаю прочитать раздел
Ответ 3
На самом деле есть несколько простых правил, которые позволят вам в большинстве случаев обеспечить производительность:
-
Индексы являются первой частью. Первичные ключи автоматически индексируются. Я рекомендую поместить индексы на все внешние ключи. Затем добавьте индексы ко всем столбцам, которые часто запрашиваются, если в таблице, где запрашивается более одного столбца, есть сильно используемые запросы, поместите индекс в эти столбцы вместе.
-
Настройки памяти в вашей установке postgresql. Установите следующие параметры выше:
.
shared_buffers, work_mem, maintenance_work_mem, temp_buffers
Если это выделенный сервер баз данных, вы можете легко установить первые три из них на половину бара (просто будьте осторожны в Linux с общими буферами, возможно, вам нужно отрегулировать параметр shmmax), в любых других случаях это зависит от сколько бара вы хотели бы дать postgresql.
http://www.postgresql.org/docs/8.3/interactive/runtime-config-resource.html
Ответ 4
http://wiki.postgresql.org/wiki/Performance_Optimization
Ответ 5
Абсолютным минимумом, который я рекомендую, является команда EXPLAIN ANALYZE. Он покажет разбивку подзапросов, объединений и т.д., Все время показывая фактическое количество времени, затраченного на операцию. Он также предупредит вас о последовательном сканировании и других неприятных неприятностях.
Это начало best.
Ответ 6
Поместите fsync = off в свой posgresql.conf, если вы доверяете своей файловой системе, иначе каждая операция postgresql будет немедленно записана на диск (с системным вызовом fsync).
У нас эта опция отключена на многих производственных серверах с 10 лет, и у нас никогда не было сбоев данных.