MySQL: много таблиц или много баз данных?


для проекта у нас есть куча данных, которые всегда имеют одинаковую структуру и не связаны друг с другом. Существует два подхода к сохранению данных:

  • создание новой базы данных для каждого пула (около 15-25 таблиц)
  • создание всех таблиц в одной базе данных и различать пулы по именам таблиц.

какой из них проще и быстрее обрабатывать для MySQL?

EDIT: Я Не интересуюсь вопросами базы данных дизайн, я просто интересуюсь, какая из двух возможностей быстрее.

EDIT 2: я постараюсь сделать это более ясным. Как уже было сказано, у нас будут данные, где некоторые даты редко принадлежат друг другу в разных пулах. Помещать все данные одного типа в одну таблицу и связывать ее с идентификатором пула не очень хорошая идея:

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

идея в том, чтобы сделать базу данных для каждого бассейне или создать много таблиц в одной базе данных. 50% запросов к базе данных будет просто inserts. 49% будет какой-то простой selects на первичный ключ.

вопрос в том, что быстрее ручки для MySQL? Много таблиц или много баз данных?

9 61

9 ответов:

не должно быть существенной разницы в производительности между несколькими таблицами в одной базе данных и несколькими таблицами в отдельных базах данных.

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

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

SELECT * FROM database17.accounts_table;

Это чисто синтаксическая разница. Это не должно влиять на производительность.

Что касается хранения, вы не можете организовать таблицы в файл для каждой базы данных, как предполагает @Chris. С помощью механизма хранения MyISAM у вас всегда есть файл для каждой таблицы. С InnoDB storage engine, у вас либо есть один набор файлов хранения, которые объединяют все таблицы, либо у вас есть файл на таблицу (это настроено для всего сервера MySQL, а не для базы данных). В любом случае создание таблиц в одной базе данных по сравнению со многими базами данных не имеет преимуществ или недостатков в производительности.

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

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

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

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

Если вы не хотите один набор таблиц с poolID poolname как thetxi предложил, используйте отдельные базы данных, а не несколько таблиц, которые все делают то же самое.

таким образом, вы ограничиваете вариацию между доступом к различным пулам к первоначальному оператору "use database", вам не придется каждый раз перекодировать свои выборки или иметь динамический sql.

другими преимуществами этого подхода являются:

  • легко резервное копирование/восстановление
  • легкий запуск/остановка экземпляра БД.

недостатки:

  • немного больше работы администратора, но не так много.

Я не знаю, что ваше приложение, но действительно подумайте, прежде чем создавать все таблицы в одной базе данных. Так лежит безумие.

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

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

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

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

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

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

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

Я не слишком уверен, что полностью понимаю ваш сценарий. Вы хотите, чтобы все пулы использовали одни и те же таблицы, но просто отличались отличительным ключом? Или вы хотите, чтобы отдельные пулы таблиц в одной базе данных, с суффиксом на каждой таблице, чтобы различать пулы?

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

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

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

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

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

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

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

Что касается исчерпания первичных ключей, вы всегда можете использовать составной первичный ключ, если вы используете таблицы MyISAM. Например, если у вас есть поле с именем groupCode (любой тип) и другое с именем sequenceId (auto increment) и создайте свой первичный ключ как groupCode+sequenceId. В sequenceId будет приращение на основе следующего уникального идентификатора в наборе кодов группы. Например: AAA 1 ААА 2 BBB 1 ААА 3 CCC 1 AAA 4 BBB 2 ...

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

Я не очень хорошо знаю mysql, но я думаю, что мне придется дать стандартный ответ на производительность - "это зависит".

некоторые мысли (связанные только с производительностью / обслуживанием, а не с дизайном базы данных):

  • создание новой базы данных означает отдельный файл (или файлы) в файловой системе. Затем эти файлы могут быть помещены в разные файловые системы, если производительность одного должна быть отделена от других и т. д.
  • новая база данных, вероятно, будет обрабатывать кэширование по-разному; например. Все таблицы в одной БД будут означать общий кэш для БД, тогда как разделение таблиц на отдельные базы данных означает, что каждая база данных может иметь отдельный кэш [очевидно, что все базы данных будут иметь одинаковую физическую память для кэша, но может быть ограничение на базу данных и т. д.].
  • связанные с отдельными файлами, это означает, что если один из ваших наборов данных становится более важным, чем другие, его можно легко вытащить на новый сервер.
  • разделение баз данных имеет дополнительное преимущество, позволяющее развертывать обновления по одному более легко, чем с одной базой данных.

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

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

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

FTR, в обычных обстоятельствах я бы взял подход, описанный TheTXI.

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

одна база данных, вероятно, проще. Вам придется беспокоиться только об одном соединении и все равно придется указывать таблицы. Однако при определенных условиях несколько баз данных могут быть быстрее.

на твоем месте я бы попробовал и то и другое. Мы ни за что этого не сделаем. быть в состоянии дать вам полезный ответ.