Обрезка раздела mysql не работает

Я создал таблицу с разделом MySQL по hash(to_days(...)).

CREATE TABLE `requestlog` (
  `remotehost` varchar(40) DEFAULT NULL,
  `user` varchar(255) DEFAULT NULL,
  `request_time_str` varchar(40) DEFAULT NULL,
  `request_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `request_line` varchar(255) DEFAULT NULL,
  `status` int(11) DEFAULT NULL,
  `bytes` int(11) DEFAULT NULL,
  `referer` text,
  `useragent` text,
  `host` text,
  `instance` text,
  `ms` int(11) DEFAULT NULL,
  `cpu_ms` int(11) DEFAULT NULL,
  `api_cpu_ms` int(11) DEFAULT NULL,
  `cpm_usd` float DEFAULT NULL,
  `queue_name` varchar(40) DEFAULT NULL,
  `task_name` varchar(40) DEFAULT NULL,
  `loading_request` tinyint(1) DEFAULT NULL,
  `pending_ms` int(11) DEFAULT NULL,
  `exit_code` int(11) DEFAULT NULL,
  `throttle_code` int(11) DEFAULT NULL,
  `method` varchar(40) DEFAULT NULL,
  `path` varchar(255) DEFAULT NULL,
  `querystring` text,
  `protocol` varchar(40) DEFAULT NULL,
  `applog` text,
  `applog0` text,
  `applog1` text,
  `applog2` text,
  `applog3` text,
  `applog4` text,
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMES
TAMP,
  PRIMARY KEY (`request_time`,`id`),
  UNIQUE KEY `path` (`path`,`request_time`,`remotehost`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
/*!50100 PARTITION BY HASH (to_days(request_time))
PARTITIONS 1000 */

Однако пока выполняю следующий запрос. результат explain partitions показывает, что сокращение раздела не работает, потому что оно сканирует все разделы, принадлежащие этой таблице ...

explain partitions select count(*) from requestlog where to_days(request_time) = '2012-08-01';

Я пробовал образец в этой статье. Разделы объяснения по-прежнему показывают, что он сканирует все разделы. как разделить таблицу по столбцу datetime?

Как сделать так, чтобы обрезка раздела работала? Какие-нибудь намеки?


person lucemia    schedule 16.08.2012    source источник


Ответы (1)


попробуйте это без to_days:

explain partitions select count(*) from requestlog where request_time = '2012-08-01';

РЕДАКТИРОВАТЬ:

explain partitions 
        select count(*) 
        from requestlog 
        where request_time BETWEEN '2012-08-01 00:00:00' AND '2012-08-01 23:59:59';
person Omesh    schedule 16.08.2012
comment
удаление разделов работает в этом случае, но сам запрос возвращает только те результаты, для которых request_time = '2012-08-01 00:00:00' - person lucemia; 16.08.2012
comment
это работает, потому что у вас есть индекс в столбце request_time. также функция To_DAYS возвращает целочисленное значение, которое вы сравниваете со значением даты. - person Omesh; 16.08.2012
comment
сокращение разделов работает в этом запросе, но результаты неверны. например, этот запрос игнорирует данные, у которых request_time = '2012-08-01 00:00:01' - person lucemia; 16.08.2012
comment
попробуйте новый отредактированный запрос или вы также можете использовать DATE(request_time) = '2012-08-01'; - person Omesh; 16.08.2012
comment
оба where request_time between ... и where date(request_time) = ... будут сканировать все разделы. Думаю, MySQL просто не поддерживает такую ​​обрезку разделов. - person lucemia; 16.08.2012
comment
HASH будет работать, если у вас есть отдельный столбец ДАТА. вам нужно создать PARITION BY RANGE, чтобы диапазон работал. Если у вас MySQL 5.5, вы также можете создать его в поле TIMESTAMP. dev.mysql.com/doc/refman/5.5/en/ partitioning-range.html - person Omesh; 16.08.2012