(MySQL版本:5.6.15)MySQL表分區奇怪的行爲(慢速查詢突然)
我有10M行一個巨大的表(表-A),在實體 - 屬性 - 值模型。 它有一個複合唯一鍵[Field_A + Element + DataTime]。
CREATE TABLE TABLE_A
(
`Field_A` varchar(5) NOT NULL,
`Element` varchar(5) NOT NULL,
`DataTime` datetime NOT NULL,
`Value` decimal(10,2) DEFAULT NULL,
UNIQUE KEY `A_ELE_TIME` (`Field_A`,`Element`,`DataTime`),
KEY `DATATIME` (`DataTime`),
KEY `ELEID` (`ELEID`),
KEY `ELE_TIME` (`ELEID`,`DataTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
行進行插入/更新的表中每隔分鐘,因此每個[DATATIME](即每分鐘)的行大小是規則的,圍繞3K行。
我有從該表中「選擇」的查詢,之後與上述「插入/更新」。 查詢選擇最近25小時內(約30K行)內的一個指定元素。該查詢通常在3秒內處理。
SELECT
Field_A, Element, DataTime, `Value`
FROM
Table_A
WHERE
Element="XX"
AND DataTime between [time] and [time].
原來的家務將在3天后每5分鐘刪除任何一行。
爲了更好的整理,我嘗試分區上[DATATIME],每6小時工作臺底座。 (00,06,12,18當地時間)
PARTITION BY RANGE (TO_DAYS(DataTime)*100+hour(DataTime))
(PARTITION p2014103112 VALUES LESS THAN (73590212) ENGINE = InnoDB,
...
PARTITION p2014110506 VALUES LESS THAN (73590706) ENGINE = InnoDB,
PARTITION pFuture VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
我的看家腳本將丟棄過期的分區,然後創建一個新的
ALTER TABLE TABLE_A REORGANIZE PARTITION pFuture INTO (
PARTITION [new_partition_name] VALUES LESS THAN ([bound_value]),
PARTITION pFuture VALUES LESS THAN MAXVALUE
)
新的進程似乎平穩運行。
然而,SELECT查詢會突然減速(> 100秒)。
即使所有進程都停止,查詢仍然很慢。直到「分析分區」(讀取和存儲分區的密鑰分發)纔會被修復。
它通常發生在一天。
它不會發生在非分區表中。
因此,我們認爲它是由損壞的索引的分區的MySQL(巨大)表造成的。
有沒有人有任何想法如何解決它?
很多感謝!
您可以使用'EXPLAIN PARTITIONS'發表解釋結果嗎? – 2014-11-03 06:25:58
Jaugar Chang:EXPLAIN PARTITIONS將查詢所有分區 – user1513598 2014-11-04 07:07:50
分區太多會減慢查詢速度。沒有適合您的查詢和內務管理的分區解決方案。但是你的查詢會比家務更頻繁地執行。儘量減少分區的數量以適應查詢的需要。順便提一下,建議您將此主題遷移到數據庫管理員網站,也許您可以在那裏獲得更好的答案。 – 2014-11-04 08:39:13