2014-11-03 71 views
1

(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(巨大)表造成的。

有沒有人有任何想法如何解決它?

很多感謝!

+0

您可以使用'EXPLAIN PARTITIONS'發表解釋結果嗎? – 2014-11-03 06:25:58

+0

Jaugar Chang:EXPLAIN PARTITIONS將查詢所有分區 – user1513598 2014-11-04 07:07:50

+0

分區太多會減慢查詢速度。沒有適合您的查詢和內務管理的分區解決方案。但是你的查詢會比家務更頻繁地執行。儘量減少分區的數量以適應查詢的需要。順便提一下,建議您將此主題遷移到數據庫管理員網站,也許您可​​以在那裏獲得更好的答案。 – 2014-11-04 08:39:13

回答

0

如果你PARTITION BY RANGE (TO_DAYS(DataTime)*100+hour(DataTime)),當你使用between [from] and [to]操作過濾日期時間時,mysql將掃描所有分區,除非[from]等於[to]

因此,您的查詢突然減慢是合理的。

我的建議是使用TO_DAYS(DataTime)沒有小時分區,如果查詢近25個小時的數據,它會掃描最多也只有2個分區。

我不擅長MySQL和我不能解釋它,希望其他聰明的傢伙可以進一步解釋。但你可以使用EXPLAIN PARTITIONS來證明它。這裏是Sql Fiddle Demo