MySQL против PostgreSQL? Что я должен выбрать для моего проекта Django? - PullRequest
58 голосов
/ 25 февраля 2009

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

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

Ответы [ 10 ]

56 голосов
/ 11 мая 2010

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

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

43 голосов
/ 25 февраля 2009

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

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

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

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

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

40 голосов
/ 25 февраля 2009

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

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

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

8 голосов
/ 08 мая 2011

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

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

MySQL предназначен для обработки "коротких подключений" (подключайтесь, выполняйте запросы, отключайтесь, имеет некоторые проблемы с производительностью из-за большого количества открытых подключений )

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

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

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

8 голосов
/ 25 февраля 2009

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

6 голосов
/ 02 июня 2015

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

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

Поддержка бэкэнда

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

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

PostgreSQL

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

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

MySQL

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

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

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

SQLite

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

  • Создание новой таблицы с новой схемой
  • Копирование данных по
  • Отбрасывание старого стола
  • Переименование новой таблицы в соответствии с исходным именем

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

3 голосов
/ 05 июня 2012

Когда в 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)
2 голосов
/ 08 мая 2011

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

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

Индекс FULLTEXT в MySQL - это шутка.

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

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

1 голос
/ 25 февраля 2009

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

0 голосов
/ 13 ноября 2013

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

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