Я работаю с MySQL 5.6. Я создал таблицу с 366 разделами для сохранения данных по дням. В году у нас максимум 366 дней, поэтому я создал 366 разделов в этой таблице. Хэш-разделы управлялись целочисленным столбцом, в котором для каждой записи хранится от 1 до 366.
Таблица Report_Summary:
CREATE TABLE `Report_Summary` (
`PartitionsID` int(4) unsigned NOT NULL,
`ReportTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Amount` int(10) NOT NULL,
UNIQUE KEY `UNIQUE` (`PartitionsID`,`ReportTime`),
KEY `PartitionsID` (`PartitionsID`),
KEY `ReportTime` (`ReportTime`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPRESSED
/*!50100 PARTITION BY HASH (PartitionsID)
PARTITIONS 366 */
Мой текущий запрос:
SELECT DATE(RS.ReportTime) AS ReportDate, SUM(RS.Amount) AS Total
FROM Report_Summary RS
WHERE RS.ReportTime >= '2014-12-26 00:00:00' AND RS.ReportTime <= '2014-12-30 23:59:59' AND
RS.PartitionsID BETWEEN DAYOFYEAR('2014-12-26 00:00:00') AND DAYOFYEAR('2014-12-30 23:59:59')
GROUP BY ReportDate;
Приведенный выше запрос отлично работает и использует разделы с p360 по p364 для получения данных. Теперь проблема заключается в том, что когда я передаю fromDate в «2014-12-26» и toDate в «2015-01-01», тогда приведенный выше запрос не будет работать. Поскольку день года для '2015-01-01' равен 1, мои условия не сработали.
Теперь я попытался передать значение в операторе IN, тогда он отлично работает при проверке базы данных ниже запроса:
SELECT DATE(RS.ReportTime) AS ReportDate, SUM(RS.Amount) AS Total
FROM Report_Summary RS
WHERE RS.ReportTime >= '2014-12-26 00:00:00' AND RS.ReportTime <= '2015-01-01 23:59:59' AND
RS.PartitionsID IN (360,361,362,363,364,365,1)
GROUP BY ReportDate;
Чтобы сгенерировать вышеприведенный сценарий, я создал функцию и передал две даты и сгенерировал строку идентификаторов, разделенных запятыми.
SELECT GenerateRange('2014-12-26 00:00:00', '2015-01-01 23:59:59');
Который возвращает мне данные как:
'360,361,362,363,364,365,366,1'
И я попытался использовать эту функцию в своем запросе, поэтому я изменил свой запрос, как показано ниже:
SELECT DATE(RS.ReportTime) AS ReportDate, SUM(RS.Amount) AS Total
FROM Report_Summary RS
WHERE RS.ReportTime >= '2014-12-26 00:00:00' AND RS.ReportTime <= '2015-01-01 23:59:59' AND
FIND_IN_SET(RS.PartitionsID, GenerateRange('2014-12-26 00:00:00', '2015-01-01 00:00:00'))
GROUP BY ReportDate;
Затем я проверил план выполнения вышеуказанного запроса, используя EXPLAIN PARTITION SELECT.... И я обнаружил, что мое условие не сработает. Он использует все разделы для получения данных. Я хочу использовать только определенные разделы этих дат. Необходимо проверить только эти 360,361,362,363,364,365,366,1 разделы, означающие p360 до p366 и p1.
Почему мой запрос не работает? И это неправильный способ реализовать это, тогда мне нужно решение. Как я могу этого добиться?
Я знаю из кода, что могу реализовать это, но мне нужно написать запрос, чтобы реализовать это.
Спасибо...
OR
в предложении where. - person BateTech   schedule 07.01.2015EXPLAIN PARTITION
в запросе с операторомPartitionsID IN(hard coded list)
, вторым запросом в вашем вопросе, вы обнаружите, что он правильно использует ваши разделы? Просьба уточнить. - person O. Jones   schedule 08.01.2015