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

После компиляции байт-код kotlin идентичен байт-коду java. Любое приложение, которое использует скомпилированные программы / дополнения для JVM, будет работать с java, kotlin и любым другим языком JVM.

62
задан TheHippo 6 April 2009 в 09:35
поделиться

9 ответов

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

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

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

SELECT * FROM database17.accounts_table;

Это - просто синтаксическое различие. Это не должно иметь никакого эффекта на производительность.

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

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

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

71
ответ дан Bill Karwin 24 November 2019 в 16:43
поделиться

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

Тем путем Вы ограничиваете изменение между доступом различных пулов к начальному "оператору" базы данных использования, Вы не должны будете повторно кодировать свои ВЫБОРЫ каждый раз или иметь динамический sql.

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

  • Легкое резервное копирование/восстановление
  • Легкий запускают/останавливают экземпляра базы данных.

Недостатки:

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

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

Править: Если производительность является единственной вещью, которая касается Вас, необходимо измерить ее. Возьмите представительный набор запросов и измерьте их уровень.

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

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

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

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

13
ответ дан Matthew Farwell 24 November 2019 в 16:43
поделиться

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

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

25
ответ дан TheTXI 24 November 2019 в 16:43
поделиться

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

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

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

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

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

2
ответ дан Chris Shaffer 24 November 2019 в 16:43
поделиться

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

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

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

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

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

4
ответ дан Josh Smeaton 24 November 2019 в 16:43
поделиться

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

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

6
ответ дан chaos 24 November 2019 в 16:43
поделиться

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

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

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

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

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

3
ответ дан Brent Baisley 24 November 2019 в 16:43
поделиться

Учитывая ограничения Вы поместили на нем, я вращал бы больше таблиц в существующей базе данных, вместо того, чтобы иметь необходимость соединиться с несколькими базами данных. Руководящие строки подключения ИМЕЮТ ТЕНДЕНЦИЮ быть более твердыми, в дополнение к управлению различной оптимизацией базы данных, которую Вы можете иметь.

2
ответ дан aronchick 24 November 2019 в 16:43
поделиться

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

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

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

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

2
ответ дан Tom Wright 24 November 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: