Почему мы делим таблицу mysql на множество меньших таблиц?

Похоже, что для повышения производительности принято использовать 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 и раздела, особенно укажите свойство hot данных.

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

Ответ 1

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

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

например.

table employee
   id integer
   name varchar
   address varchar
   country varchar

table office
   id integer
   employee_id integer
   address varchar

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

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 серверов, которые ищут в каждой стране. Разделение между серверами называется sharding.

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

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

Sharding
В sharding вы ожидаете, что все ваши данные релевантны и в равной степени вероятны для запроса. (например, 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
См. Также wiki: http://en.wikipedia.org/wiki/Partition_%28database%29


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

Ответ 2

Данные разбиваются на более мелкие таблицы, чтобы "нормализовать". Это очень интересная концепция. Здесь вы можете прочитать подробнее.

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

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

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

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

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

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

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

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

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

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

Надеюсь, что вы его получите:)