MySQL vs PostgreSQL? Что я должен выбрать для моего проекта Django?



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



какая база данных лучше всего подходит для моего проекта и почему? Можете ли вы порекомендовать какие-либо хорошие ресурсы для дальнейшего чтения?

607   10  

10 ответов:

Как человек, который недавно переключил проект с MySQL на Postgresql, я не жалею о переключении.

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

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

полнотекстовый поиск может лучше поддерживается для MySQL. MySQL имеет встроенный полнотекстовый поиск, поддерживаемый из Django, но он довольно бесполезен (без слов, поиска фраз и т. д.). Я использовал Джанго-сфинкс как лучший вариант для полнотекстового поиска в MySQL.

полнотекстовый поиск встроен в Postgresql 8.3 (более ранние версии нуждаются в модуле TSearch). Вот хорошее учебное сообщение в блоге:полнотекстовый поиск в Django с PostgreSQL и tsearch2

для чего бы это ни стоило создатели Django рекомендуют PostgreSQL.

Если вы не привязаны к какому-либо наследство система и иметь свободу выбора бэк-энд базы данных, мы рекомендуем PostgreSQL, который приносит штраф баланс между стоимостью, возможностями, скоростью и стабильность. (окончательное руководство по Django, стр. 15)

большая база данных с несколькими сотнями тысяча записей,

это не большая база данных, она очень маленькая.

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

даже если Postgresql выглядит лучше, я считаю, что у него есть некоторые проблемы с исполнением Django:

Postgresql предназначен для обработки "длинных соединений" (пул соединений, постоянные соединения и т. д.)

MySQL предназначен для обработки "коротких соединений" (connect, do your queries, disconnect,имеет некоторые проблемы производительности с большим количеством открытых соединений)

проблема в том, что Django не поддерживает пул соединений или постоянное соединение, это должен подключаться / отключаться к базе данных при каждом вызове представления.

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

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

идите с тем, с чем вы больше знакомы. MySQL vs PostgreSQL-это бесконечная война. Оба они являются отличными движками баз данных, и оба используются крупными сайтами. Это действительно не имеет значения на практике.

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

по состоянию на 1.7, миграция теперь являются неотъемлемой особенностью Django. Таким образом, они задокументировали основные различия, которые разработчики Django могут захотеть узнать заранее.

Бэкэнд Поддерживает

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

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

PostgreSQL

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

по этой причине, рекомендуется всегда создавать новые столбцы с null=True, так как таким образом они будут добавлены немедленно.

MySQL

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

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

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

SQLite

SQLite имеет очень мало встроенной поддержки изменения схемы, и поэтому Джанго пытается подражать ему:

  • создание новой таблицы с новой схемой
  • копирование данных через
  • сбросив старые таблица
  • переименование новой таблицы в соответствии с исходным именем

этот процесс обычно работает хорошо, но он может быть медленным и иногда детская коляска. Не рекомендуется запускать и переносить SQLite в a производственной среды, если вы не очень осведомлены о рисках и ограничения; поддержка Django поставляется с предназначен, чтобы позволить разработчики используют SQLite на своих локальных машинах, чтобы разрабатывать меньше сложные проекты Django без необходимости полная база данных.

когда миграция терпит неудачу в django-south, разработчики рекомендуют вам не использовать MySQL:

! The South developers regret this has happened, and would
! like to gently persuade you to consider a slightly
! easier-to-deal-with DBMS (one that supports DDL transactions)

добавить к предыдущим ответам :

  • "полнотекстовый поиск может быть лучше для MySQL"

полнотекстовый индекс в MySQL-это шутка.

  • Он работает только с таблицами MyISAM, поэтому вы теряете ACID, транзакции, ограничения, отношения, долговечность, параллелизм и т. д.
  • вставка / обновление / удаление в большой текстовый столбец (например, сообщение на форуме) будет перестраивать большую часть индекса. Если он не помещается в myisam_key_buffer, тогда большие ИО будет происходить. Я видел один триггер вставки сообщений на форуме 100 Мб или более IO ... между тем таблица сообщений исключительно заблокирована !
  • Я сделал некоторые бенчмаркинг (3 года назад, может быть, черствый...) который показал, что на больших наборах данных, в основном postgres fulltext 10-100x быстрее, чем mysql, и Xapian 10-100x быстрее, чем postgres (но не интегрирован).

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

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

существует большая разница в лицензировании между двумя БД, которая повлияет на вас, если вы когда-либо собираетесь распространять код с помощью БД. Клиентские библиотеки MySQL - это GPL, а PostegreSQL находится под лицензией BSD, с которой может быть проще работать.

Comments

    Ничего не найдено.