Почему мы разделяем таблицу MySQL на множество небольших таблиц? - PullRequest
11 голосов
/ 31 мая 2011

похоже, что divide the data of one table into many databases, many tables является обычной практикой для повышения производительности, я могу понять часть many databases, потому что больше баз данных обеспечивает больше CPUS, больше памяти, больше возможностей ввода-вывода.но много таблиц?почему бы просто не использовать разделы mysql http://dev.mysql.com/doc/refman/5.1/en/partitioning.html?

update : я не имею в виду нормализацию.я имею в виду разделить таблицу из N записей, например, на 10 таблиц, каждая из которых состоит из N / 10 записей

update2: спасибо @Johan за разъяснение sharding и partition , особенно отметьте свойство hot данных.

Небольшой вопрос, на который @Johan не ответил: для простого примера, допустим, у нас есть пользовательская таблица, в ней есть столбец идентификатора пользователя (bigint).Я думаю, что проще использовать mysql-разделение для автоматического разделения таблицы на разделы на основе идентификатора пользователя. Кажется, нет смысла разделять таблицу на небольшие таблицы вручную (на основе идентификатора пользователя), я прав?

Ответы [ 2 ]

32 голосов
/ 31 мая 2011

Я думаю, что у вас здесь есть несколько терминов.

Все ваши данные попадают в одну базу данных (она же схема).В базе данных вы можете иметь таблицы.

например,

table employee
   id integer
   name varchar
   address varchar
   country varchar

table office
   id integer
   employee_id integer
   address varchar

Внутри таблиц у вас есть поля (id, name, address) или столбцы.И таблицы имеют одну или несколько строк.
Пример для сотрудника таблицы:

id  name        address           country
----------------------------------------------------
1   John        1 Regent Street   UK
2   James       24 Jump Street    China
3   Darth Vader 1 Death Star      Bestine, Tatooine

Вот вам и основы.

Почему стоит разделить
Теперь предположим, что в нашей базе данных много и много людей (строк).
Запомните эту галактическую базу данных, поэтому у нас 100 миллиардов записей.
Если мы хотим выполнить такой быстрый поиск, было бы хорошо, если бы мы могли делать это параллельно.
Таким образом, мы разбиваем таблицу (скажем, по странам), и тогда у нас может быть x серверов, просматривающих по 1 стране каждый.
Распределение по серверам называется sharding.

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

В чем большая разница между sharding может просто partitioning?

Sharding
Insharding вы ожидаете, что все ваши данные актуальны и одинаково вероятны для запроса.(например, Google может ожидать, что все их данные будут запрошены; архивирование части их данных для них бесполезно).
В этом случае вам нужно, чтобы множество машин просматривало ваши данные параллельно, где каждый компьютер выполняет часть работы..
Таким образом, вы предоставляете каждой машине свой раздел (фрагмент) данных и задаете всем машинам один и тот же запрос.Когда результаты получаются, вы UNION все вместе и выводите результат.

Основное разбиение
В базовом partitioning часть ваших данных hot, а часть not.Типичный случай - исторические данные, новые данные hot, старые данные почти не затрагиваются.
В этом случае бессмысленно размещать старые данные на отдельных серверах.Эти машины будут просто ждать и ждать и ничего не делать, потому что никому нет дела до старых данных, за исключением некоторых аудиторов, которые смотрят их раз в год.
Таким образом, вы разбиваете эти данные по годам, и сервер автоматически архивирует старые разделы, чтобы ваши запросыбудет смотреть только один (возможно, 2) год данных и будет намного быстрее.

Нужно ли разделение?
Вы делаете разделение только тогда, когда у вас много и много данных,потому что это усложняет вашу настройку.
Если у вас нет более миллиона записей, вам не нужно рассматривать разбиение. *)
Если у вас более 100 миллионов записей, вам определенно следуетрассмотреть это. *)

Для получения дополнительной информации см .: http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
и: http://blog.mayflower.de/archives/353-Is-MySQL-partitioning-useful-for-very-big-real-life-problems.html
См. также вики: http://en.wikipedia.org/wiki/Partition_%28database%29


*) Это всего лишь моя личная эвристика YMMV.

0 голосов
/ 31 мая 2011

Данные разбиты на более мелкие таблицы для «нормализации».Это очень интересная концепция.Вы можете прочитать больше об этом здесь.

http://en.wikipedia.org/wiki/User:Jaseemabid/Books/Database_normalisation

Быстрый пример.

Предположим, небольшое приложение телефонной книги позволяет людям иметь несколько номеров

Один из способов дизайна был бы таким:

  • Имя | Номер
  • A |123
  • A |95467
  • B |179

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

  • Уникальный идентификатор |имя
  • 1 |A
  • 2 |B

  • Уникальный идентификатор |номер

  • 1 |123
  • 1 |95467
  • 2 |179

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

Надеюсь, вы поняли:)

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