какую базу данных выбрать, если производительность postgres низкая - PullRequest
6 голосов
/ 15 октября 2008

В веб-приложении, которое поддерживает более 5000 пользователей, postgres становится узким местом.

Добавление нового пользователя занимает более 1 минуты (даже после оптимизации и в Win 2k3)

Итак, что касается дизайна, какие другие БД могут быть лучше?

Ответы [ 12 ]

49 голосов
/ 15 октября 2008

Скорее всего, это не PostgreSQL, это ваш дизайн. Смена обуви, скорее всего, не сделает вас лучшим танцором.

Знаете ли вы, что вызывает медлительность? Это утверждение, время для обновления индексов, время поиска? Все 5000 пользователей пытаются записать данные в таблицу пользователей в то же самое время, когда вы пытаетесь вставить 5001-го пользователя? Я верю, что это может вызвать проблемы. Возможно, вам придется пойти с чем-то настроенным на обработку экстремального параллелизма, например с Oracle.

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


P.S. У нас было небольшое обсуждение в комментариях к другому ответу - обратите внимание, что некоторые из самых больших в мире баз данных с хранилищем реализованы с использованием Postgres (хотя они имеют тенденцию настраивать внутренние компоненты движка). Postgres очень хорошо масштабируется для размера данных, для параллелизма лучше, чем для большинства, и очень гибок в плане того, что вы можете с ним сделать.

Хотелось бы, чтобы у вас был лучший ответ, спустя 30 лет после изобретения технологии, мы должны быть в состоянии заставить пользователей иметь менее подробные знания о системе, чтобы она работала бесперебойно. Но, увы, для всех продуктов, которые я знаю, требуются обширные размышления и настройки. Интересно, могли бы создатели StackOverflow рассказать, как они справились с параллелизмом и масштабируемостью БД? Они используют SQLServer, я знаю это очень много.


P.P.S. Так что, по случайности, я вчера столкнулся с проблемой параллелизма в Oracle. Я не совсем уверен, что я прав, не будучи администратором базы данных, но ребята объяснили это примерно так: у нас было большое количество процессов, подключающихся к базе данных и проверяющих системный словарь, что, по-видимому, вызывает короткую блокировку. Несмотря на то, что это просто чтение. Синтаксический анализ запросов делает то же самое ... поэтому у нас (в многотеразонной системе с тысячами объектов) было много вынужденных ожиданий, потому что процессы блокировали друг друга из системы. Наш системный словарь также был чрезмерно большим, потому что он содержит отдельную копию всей информации для каждого раздела, которых может быть тысячи на таблицу. На самом деле это не имеет отношения к PostgreSQL, но необходимо сделать следующее: помимо проверки вашего проекта, убедитесь, что ваши запросы используют переменные связывания и используются повторно, а нагрузка на общие ресурсы минимальна.

9 голосов
/ 15 октября 2008

Пожалуйста, измените ОС, под которой вы запускаете Postgres - порт Windows, хотя он очень полезен для расширения пользовательской базы, все еще не на уровне с (намного более старой и более зрелой) Un * x порты (и особенно Linux).

5 голосов
/ 15 октября 2008

Позвольте мне представить вам самый простой и практичный способ масштабирования практически любого сервера баз данных, если структура базы данных действительно оптимальна: просто удвойте свою оперативную память для мгновенного повышения производительности. Это как магия.

5 голосов
/ 15 октября 2008

Я считаю, что вашим лучшим выбором по-прежнему является PostgresSQL. Потратьте время, чтобы убедиться, что вы правильно настроили свое приложение. Убедившись, что вы достигли предела того, что можно сделать с помощью настройки, начните кэшировать все, что можете. После этого начните думать о переходе на установку асинхронного главного ведомого ... Также вы используете функциональность типа OLAP в той же базе данных, на которой вы выполняете OLTP?

3 голосов
/ 15 октября 2008

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

2 голосов
/ 26 марта 2010

Как отмечалось выше, проблема не в конкретной используемой вами базе данных, т.е. PostgreSQL, а в одном из следующих:

  • Дизайн схемы, возможно, вам нужно добавить, удалить, уточнить ваши индексы
  • Аппаратное обеспечение, возможно, вы спрашиваете большую часть своего сервера - вы сказали, что 5k пользователей, но опять же, очень немногие из них, вероятно, одновременно запрашивают БД
  • Запросы: возможно, плохо определены, что приводит к большой неэффективности

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

  • Наиболее часто исполняемый
  • Дольше всего
  • и т.д.. и т.д.

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

Хорошие новости ... Есть много утилит для анализа ваших файлов журналов, которые просты в использовании и легко интерпретируют результаты, вот две:

pgFouine - анализатор логов PostgreSQL (PHP)

PQA (рубин)

1 голос
/ 27 сентября 2010

Привет ранее имел ту же проблему с моей нынешней компанией. Когда я впервые присоединился к ним, их запросы были огромными и очень медленными. Требуется 10 минут, чтобы запустить их. Я смог оптимизировать их до нескольких миллисекунд или 1-2 секунды. За это время я многому научился, и я поделюсь с вами некоторыми основными моментами.

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

    например. ВЫБРАТЬ * ОТ (ВЫБРАТЬ * ОТ ЛИЦА, ГДЕ человек ilike '% abc') КАК человек;

Если вы посмотрите на пример выше, это сократит ваши результаты до того, что, как вы знаете, вам нужно, и вы сможете улучшить их, выполнив внутреннее объединение. Это один из лучших способов ускорить ваш запрос, но существует несколько способов убрать кошку из кожи. Я не могу объяснить все их здесь, потому что их слишком много, но из приведенного выше примера вам просто нужно изменить это, чтобы удовлетворить ваши потребности.

  1. Это зависит от вашей версии postgres. Старые postgres оптимизируют запрос внутренне. Например, на postgres 8.2 и ниже операторы IN работают медленнее, чем 8.4.

  2. ОБЪЯСНИТЕ АНАЛИЗ - ваш друг. если ваш запрос выполняется медленно, выполните анализ объяснения, чтобы определить, какой из них вызывает медлительность.

  3. Очистите вашу базу данных. Это гарантирует, что статистика в вашей базе данных будет практически соответствовать фактическому результату. Большая разница в статистике и фактических данных приведет к медленному выполнению вашего запроса.

  4. Если все это не поможет вам, попробуйте изменить ваш postgresql.conf. Увеличьте общую память и попробуйте поэкспериментировать с конфигурацией, чтобы лучше соответствовать вашим потребностям.

Надеюсь, это поможет, но, конечно, это только для оптимизации postgres.

кстати. 5000 пользователей это не много. Моя БД содержит пользователей от 200 до миллиона пользователей.

1 голос
/ 15 октября 2008

Я бы посоветовал посмотреть здесь информацию о производительности PostgreSQL: http://enfranchisedmind.com/blog/2006/11/04/postgres-for-the-win

Какую версию PG вы используете? По мере развития выпусков производительность значительно улучшилась.

1 голос
/ 15 октября 2008

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

0 голосов
/ 27 ноября 2008

Если у вас много операций перезаписи, вы можете попробовать MySQL, предполагая, что проблема связана с Postgres, но ваша проблема - проблема записи.

Тем не менее, вы можете захотеть взглянуть на дизайн вашей базы данных, и, возможно, рассмотреть вопрос о шардинге. Для действительно большой базы данных вам все равно, возможно, придется взглянуть на вышеупомянутые 2 проблемы независимо от этого.

Вы также можете посмотреть на серверы баз данных без RDBMS или документы, ориентированные на Mensia и CouchDB, в зависимости от поставленной задачи. Ни один инструмент не справится со всеми задачами, поэтому выбирайте мудро.

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

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