Горизонтальное разбиение в MySQL

У меня есть таблица с ~ 20 столбцами.

-----------------------------------------------------------------
  GUID_PK  |  GUID_SET_ID  |  Col_3  |  Col_4  |  ... | Col_20
-----------------------------------------------------------------

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

Только SET_ID является входящим внешним ключом. PK — это исходящий внешний ключ к другой таблице. в таблице подробностей хранится около 3 или 4 записей (каждая из которых представляет собой отдельный большой двоичный объект) на основную запись.

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

Массовые вставки и массовые выборки определенно повлияют на производительность. Массовое удаление снова изменит порядок индексов. Какой должна быть оптимальная структура?


person inquisitive    schedule 04.07.2013    source источник
comment
когда вы вставляете данные, все столбцы, такие как Col_x, заполняются? или только некоторые?   -  person Stephan    schedule 04.07.2013
comment
@Stephan все столбцы заполняются за один раз. на самом деле два столбца могут быть нулевыми, а иногда, но редко, они могут быть нулевыми. но никакая запись не обновляется позже. что сделано - то сделано.   -  person inquisitive    schedule 04.07.2013
comment
в этом случае вы можете разбить таблицу по GUID_SET_ID с помощью хэша dev. mysql.com/doc/refman/5.1/en/partitioning-hash.html   -  person Stephan    schedule 04.07.2013
comment
но хеш-разделы изначально принимают фиксированное количество разделов. как определить этот номер? есть ли параметр решения? лучшая практика?   -  person inquisitive    schedule 04.07.2013
comment
это зависит от объема данных, которые вы получаете ежедневно   -  person Stephan    schedule 04.07.2013
comment
взгляните на типы разделов ... возможно, вам больше подойдет другой тип: dev.mysql.com/doc/refman/5.1/en/partitioning-types.html   -  person Stephan    schedule 04.07.2013
comment
@Стефан, не могли бы вы опубликовать свое мнение в виде краткого ответа. ваша помощь переросла комментарии. это может быть ответ, который я ищу.   -  person inquisitive    schedule 04.07.2013


Ответы (1)


Принимая во внимание, что большинство столбцов Col_x заполнено, вы можете сделать HASH PARTITIONING :

CREATE TABLE 

....

PARTITION BY HASH(GUID_SET_ID)
PARTITIONS NO_PART;

Где NO_PART - количество разделов, которое вы хотите, это должно быть установлено с учетом:

1) объем данных, которые вы получаете ежедневно
2) объем данных, который, по вашим оценкам, будет получен в будущем

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

person Stephan    schedule 04.07.2013