Вы разбили секцию на TO_DAYS (дата), это означает, что сокращение секционирования будет в основном происходить только в простых случаях, если вы не примените TO_DAYS (date) к ограничениям.
Вы должны будете сделать, например, выберите * из ptest, где день между TO_DAYS ('2010-03-11') и TO_DAYS ('2010-03-12') - хотя в этом случае могут быть недостатки в mysql между.
Разделение по датам в mysql сложно, и в реализации разделения есть много недостатков, по крайней мере, если вы хотите охватить множество различных ограничений запроса, мы обычно помещаем целочисленный идентификатор в таблицы, указывающие на календарь вместо тип DATE, поскольку мы обнаружили, что mysql для обработки разбиения по простому целому числу достаточно надежен по сравнению с разбиением по столбцам с функцией (такой как TO_DAYS), мы имеем
create table datatbl (
time_id int NOT NULL,
....
);
time_id ссылается на календарь, заполненный датами на следующие 10 лет, в виде
create table calendar (
time_id int primary key
year int NOT NULL,
month int NOT NULL,
day int NOT NULL,
dayofyear int NOT NULL,
quarter int NOT NULL,
is_weekend char(1) NOT NULL,
db_date DATE not NULL,
unique index(year,month,day),
unique index(dbdate)
);
Запросы объединяются в эту таблицу, поэтому для получения всех данных за месяц требуется where cal.year = 2010 and cal.month = 1
. Или это можно сделать как cal.db_date between '2010-01-01' and '2010-01-31'
datatbl
разделен на time_id, и вышеупомянутые запросы заставят mysql делать сокращение секционирования. time_id также является составной частью года / месяца / даты, поэтому time_id для 2010-03-03 будет целым числом 20100303, которое не следует использовать для запроса, это просто удобство для сценариев, которые автоматически создают new / drop старые разделы.