Сегментирование таблицы по дате

Obsess
Дата: 10.02.2013 16:41:09
Я хочу разбить следующую таблицу на разделы:

CREATE TABLE tst_table (
    dtime decimal(17,3)
);

dtime - время с милисекундами. Например 2013-02-10 15:16:45,100 = 20130210151645.100
Когда делаю следующее:
CREATE TABLE tst_table (
    dtime decimal(17,3)
)
PARTITION BY RANGE ( YEAR(dtime) ) (
    PARTITION p0 VALUES LESS THAN (2013),
    PARTITION p1 VALUES LESS THAN (MAXVALUE)
);

То возникает сообщение об ошибке
ERROR 1486 (HY000): Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed

В руководстве http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html приведён пример:
CREATE TABLE employees (
    separated DATE
)
PARTITION BY RANGE ( YEAR(separated) ) (
    PARTITION p2 VALUES LESS THAN (2001),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

Стоит заменить "separated DATE" на "separated INT" или "separated DEC(17,3)" возникает ошибка. Разве при использовании "separated DATE" выражение YEAR(separated) перестаёт быть timezone-dependent expressions?
Как разбить таблицу на разделы по годам? При этом дата хранится с милисекундами, так что тип у неё будет либо INT, либо decimal(17,3).
Obsess
Дата: 10.02.2013 19:01:55
Пока единственный вариант, который приходит в голову.
CREATE TABLE tst_table4 (
    dtime int
)
PARTITION BY RANGE ( dtime ) (
    PARTITION p0 VALUES LESS THAN (1325365200000),
    PARTITION p1 VALUES LESS THAN (1356987600000),
    PARTITION p2 VALUES LESS THAN (MAXVALUE)
);

dtime - время в милисекундах, прошедшее с начала 1970 года.
Можно ли это сделать по-проще? Например, мне требуется разбить одну таблицу на 10 лет, другую на 5. И, возможно, дальше изменять количество разделов в сторону увеличения.
Что-то вроде этого:
CREATE TABLE tst_table5 (
    dtime int
)
PARTITION BY HASH( get_year(dtime) ) 
PARTITIONS 10;

get_year(mlsec int) - собственная функция, получающая год из dtime. Так пробовал, но опять возникает прежняя ошибка
...timezone-dependent expressions are not allowed
miksoft
Дата: 10.02.2013 21:15:06
Первый вариант можно попробовать разбить так:
CREATE TABLE tst_table (
    dtime decimal(17,3)
)
PARTITION BY RANGE ( dtime ) (
    PARTITION p0 VALUES LESS THAN (20130000000000),
    PARTITION p1 VALUES LESS THAN (MAXVALUE)
);
Не стоит применять функции для работы с датами к типам данных, которые не являются датой или временем.
Obsess
Дата: 11.02.2013 23:33:06
miksoft
Не стоит применять функции для работы с датами к типам данных, которые не являются датой или временем.

Спасибо за совет.
miksoft
Первый вариант можно попробовать разбить так:
CREATE TABLE tst_table (
    dtime decimal(17,3)
)
PARTITION BY RANGE ( dtime ) (
    PARTITION p0 VALUES LESS THAN (20130000000000),
    PARTITION p1 VALUES LESS THAN (MAXVALUE)
);

Range принимает только INT.
При хранении времени в виде (микро)секунд, прошедших с 1970 года, легче оперировать временем, вычислять разность. С десятичным представлением так не выходит.
miksoft
Дата: 11.02.2013 23:42:25
А как насчет варианта разбить поле на два - дата (тип date) и время (какой хотите тип)?
Секционировать по первому(дате).
Obsess
Дата: 12.02.2013 11:26:54
автор
А как насчет варианта разбить поле на два - дата (тип date) и время (какой хотите тип)?
Секционировать по первому(дате).

C типом INT будет быстрее работать.

И у меня есть ещё вопрос.
Планируется таблица c подразделами
CREATE TABLE tst_table (
    id_company INT,
    dtime datetime -- дата с милисекундами
)
PARTITION BY RANGE( YEAR(dtime) )
SUBPARTITION BY HASH( id_company )
SUBPARTITIONS 3 ( -- количество компаний, которое будет меняться
	PARTITION p0 VALUES LESS THAN (2013),
	PARTITION p1 VALUES LESS THAN (2014),
        PARTITION p2 VALUES LESS THAN (MAXVALUE)
);

Как можно увеличить количество подразделов?
И есть ли разница между таким способом разбиения и способом ниже? В скорости или ещё в чём.
CREATE TABLE tst_table  ( 
    id_company INT,
    dtime datetime -- дата с милисекундами
)
PARTITION BY LIST (id_company)
SUBPARTITION BY RANGE (year(dtime))
(
PARTITION P01 VALUES IN (1)
(
SUBPARTITION S01 VALUES LESS THAN (2013),
SUBPARTITION S02 VALUES LESS THAN (2014),
SUBPARTITION S03 VALUES LESS THAN (MAXVALUE)
));
miksoft
Дата: 12.02.2013 11:30:32
Obsess,

Если не секрет, сколько всего записей планируется в таблице, если вы так витиевато хотите ее разбивать?
Obsess
Дата: 12.02.2013 14:56:17
miksoft
Если не секрет, сколько всего записей планируется в таблице, если вы так витиевато хотите ее разбивать?

В районе 1,5 млн в год, примерно 100 тыс. в месяц, для каждой компании.
miksoft
Дата: 12.02.2013 15:00:11
Obsess
В районе 1,5 млн в год
Из-за такой ерунды я бы не стал связываться с секционированием таблиц. Разве что была какая-нибудь очень экзотическая нужда, типа необходимости в частом и быстром сканировании секции.