Удалите оптимизацию, используя секционированную таблицу mysql (MySQL 5.1) - PullRequest
1 голос
/ 11 января 2012

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

    CREATE TABLE `professional_scoring_log` (
      `professional_id` int(11) NOT NULL,
      `score_date` date NOT NULL,
      `scoring_category_attribute_id` int(11) NOT NULL,
      `displayable_score` decimal(7,3) NOT NULL,
      `created_at` datetime NOT NULL,
      PRIMARY KEY (`professional_id`,`score_date`,`scoring_category_attribute_id`),
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    /*!50100 PARTITION BY RANGE (DAYOFWEEK(`score_date`))
    (PARTITION Sun VALUES LESS THAN (2) ENGINE = InnoDB,
     PARTITION Mon VALUES LESS THAN (3) ENGINE = InnoDB,
     PARTITION Tue VALUES LESS THAN (4) ENGINE = InnoDB,
     PARTITION Wed VALUES LESS THAN (5) ENGINE = InnoDB,
     PARTITION Thu VALUES LESS THAN (6) ENGINE = InnoDB,
     PARTITION Fri VALUES LESS THAN (7) ENGINE = InnoDB,
     PARTITION Sat VALUES LESS THAN (8) ENGINE = InnoDB) */

Когда моя работа, которая обрабатывает вчерашние данные, будет завершена, она удалит все записи, где score_date = current_date-1. В любой момент я, вероятно, собираю данные только в одном или двух разделах, в зависимости от времени суток.

Есть ли дыры в моих предположениях?

1 Ответ

1 голос
/ 11 января 2012

Чарли, я не вижу никаких пробелов в вашей логике / предположениях.

Полагаю, мой единственный комментарий - почему бы не использовать синтаксис удаления / добавления разделов? Это должно быть более эффективно, чем УДАЛИТЬ ИЗ .. Где ..; и это всего лишь два вызова - ничего страшного - хранить «прототип» операторов и заменять «Sun» и «2» в соответствии с требованиями для каждого дня недели - я часто использую sprintf для этого

ALTER TABLE `professional_scoring_log` DROP PARTITION Sun;


ALTER TABLE `professional_scoring_log` ADD PARTITION (
    PARTITION Sun VALUES LESS THAN (2)
);
...