Mysql помещает все данные в один раздел

У меня есть таблица из 30 миллионов строк, и я хочу разбить ее по датам.

mysql > SHOW CREATE TABLE `parameters`

CREATE TABLE `parameters` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `add_time` datetime DEFAULT NULL,
  ...(etc)
) ENGINE=MyISAM AUTO_INCREMENT=28929477 DEFAULT CHARSET=utf8 

В таблице хранятся данные за последние 5 лет, и количество строк резко увеличивается. Я хочу разделить его по годам (2009, 2010, 2011, 2012, 2013).

    ALTER TABLE parameters DROP PRIMARY KEY, ADD INDEX(id);

ALTER TABLE parameters PARTITION BY RANGE (TO_DAYS(id)) (
    PARTITION y2009 VALUES LESS THAN (TO_DAYS('2010-01-01')),
    PARTITION y2010 VALUES LESS THAN (TO_DAYS('2011-01-01')),
    PARTITION y2011 VALUES LESS THAN (TO_DAYS('2012-03-01')),
    PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')),
    PARTITION y2013 VALUES LESS THAN MAXVALUE
);

На dev-сервере все работает, а на продакшн-сервере проблема. Проблема: почти все строки перемещены в первый раздел (2009 г.). Но данные равномерно распределены по годам. Физически в папке DATA находится большой файл y2009.myd, а остальные разделы имеют гораздо меньший размер. Также я попытался реорганизовать первый раздел, чтобы исключить нулевые даты:

alter table raw
reorganize partition y2012 into (
    PARTITION y0 VALUES LESS THAN (0),
    PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')),
);

P.S.: серверы производства и разработки имеют одинаковую версию MySQL 5.1.37.


person imilbaev    schedule 26.04.2013    source источник


Ответы (1)


Вам нужно использовать столбец даты в RANGE, а не идентификатор для раздела.
Я изменил TO_DAYS(id) на TO_DAYS(add_time)

Попробуйте ниже:

ALTER TABLE parameters PARTITION BY RANGE (TO_DAYS(add_time)) (
    PARTITION y0 VALUES LESS THAN (TO_DAYS('2009-01-01')),
    PARTITION y2009 VALUES LESS THAN (TO_DAYS('2010-01-01')),
    PARTITION y2010 VALUES LESS THAN (TO_DAYS('2011-01-01')),
    PARTITION y2011 VALUES LESS THAN (TO_DAYS('2012-03-01')),
    PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')),
    PARTITION y2013 VALUES LESS THAN MAXVALUE

);

person Minesh    schedule 26.04.2013