Работя с 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