Разбиение нескольких разделов в таблице - PullRequest
1 голос
/ 07 марта 2012

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

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

У меня есть эта таблица:

CREATE TABLE SystemEvents 
(
    ID int unsigned not null auto_increment primary key,
    ReceivedAt datetime NULL,
    DeviceReportedTime datetime NULL,
    Facility smallint NULL,
    Priority smallint NULL,
    FromHost varchar(60) NULL,
    Message text,
    NTSeverity int NULL,
    EventSource varchar(60),
    EventUser varchar(60) NULL,
    EventCategory int NULL,
    EventID int NULL,
    InfoUnitID int NULL ,
    SysLogTag varchar(60),
    EventLogType varchar(60),
)

А мне нужно сделать разделы по ключу "FromHost":

PARTITIOM BY LIST (FromHost)
(
   PARTITION p01 VALUES IN ('server1'),
   PARTITION p02 VALUES IN ('server2'),
   PARTITION p03 VALUES IN ('server3', 'server4'),
   PARTITION p04 VALUES IN less than maxvalue
);

Пока здесь все в порядке. Но тут возникает трудная часть:

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

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

Итак, можете ли вы указать мне, каким будет сценарий для создания подразделов в разделах p01 и p02, отсортированных по полю receiveAt?

Если есть что-то, что не понято, пожалуйста, скажите мне, и я перефразирую это.

Большое спасибо.

С уважением. Xavidpr

1 Ответ

0 голосов
/ 26 марта 2012

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

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

Прямое решение будет следующим:

Использовать RANGE разбиение для разбивки на DateTime. Используйте разделы KEY или HASH для разделения на хосте (желательно целое число host_id)

Поскольку вы не можете использовать RANGE на подразделах, вам придется разделить на RANGE и подразделить на KEY или HASH

Другими словами, разбиение на ReceivedAt и подразделение на FromHost

...