我正在與MySQL 5.6。我創建了一個包含366個分區的表格,用於保存日期數據。在一年中,我們有最多366天的時間,因此我在該表格上創建了366個分區。散列分區由一個整數列進行管理,每個記錄存儲1到366個整數列。MySQL:無法從特定分區中選擇記錄?
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獲取數據。現在的問題是,當我通過從日期到'2014年12月26日'和日期到'2015-01-01'然後上述查詢將無法正常工作。因爲'2015-01-01'的年份是所以我的條件失敗了。
現在,我一直試圖傳遞值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;
要產生上述情況下我已經創建了一個功能,並通過兩個日期,併產生逗號分隔的ID
SELECT GenerateRange('2014-12-26 00:00:00', '2015-01-01 23:59:59');
這reurns我數據的字符串:
'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。
爲什麼我的查詢不起作用?這是不正確的方式來實現這一點,然後我想要解決方案我如何實現這一目標?
我知道從編碼我可以實現這一點,但我必須編寫一個查詢來實現這一點。
謝謝...
你打算如何處理你的請求?你在等待什麼樣的結果? – akmozo
@akmozo我想要一個工作查詢,它將使用該條件所需的分區。但我現在的狀況利用所有分區是錯誤的。 –
我們是由DAYOFYEAR分區?您是否有許多查詢將今年的某一天與前一年的某一天進行比較?如果不是,那麼如果您的查詢主要是順序數據訪問,那麼按Year或YearMonth或順序進行分區可能會更好。 – BateTech