2013-09-24 109 views
1

我有一個包含大約850萬行的MySQL Innodb表。表結構基本上是這樣的:使用MySQL分區來加速併發刪除並選擇?

CREATE TABLE `mydatatable` (
    `ext_data_id` int(10) unsigned NOT NULL, 
    `datetime_utc` date NOT NULL DEFAULT '0000-00-00', 
    `type` varchar(8) NOT NULL DEFAULT '', 
    `value` decimal(6,2) DEFAULT NULL, 
    PRIMARY KEY (`ext_data_id`,`datetime_utc`,`type`), 
    KEY `datetime_utc` (`datetime_utc`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

每天晚上,我從這個表下面的查詢刪除過期值:

delete from mydatatable where datetime_utc < '2013-09-23' 

該查詢似乎沒有使用indizes,這需要相當一段時間才能運行。不過,我也獲得併發更新並在同一張表上進行選擇。這些被鎖定,導致我的網站在當時沒有響應。

我正在尋找各種方法來加快此設置。我推測MySQL分區,我想知道這是否合適。我總是添加並選擇較新的數據到這個表中並刪除舊的數據。我可以根據類似MOD(DAYOFYEAR(datetime),4)創建分區。現在,當我刪除時,我總是會刪除另一個分區中的值,而不是正在讀取或寫入的分區。

我會使用此設置鎖定嗎?在我的情況下,分區會提高查詢速度和可用性嗎?或者我應該尋找另一個解決方案,如果是的話,哪一個?

回答

3

由於MySQL 5.5可以使用函數COLUMNS,它簡化了對非整數列(如datetime_utc)的分區。

至於性能:

  • 刪除一個分區爲LIST和RANGE分區恆定的時間操作。速度相當於TRUNCATE TABLErm file,因此實際上與分區大小無關。
  • 在分區表上做SELECT受益於partition pruning,因此您只能從與您的搜索條件匹配的分區中讀取數據。這也可以加快範圍掃描。

提示:

不要忘記添加一個「默認」的分區,如

,以避免因爲沒有分區發現插入INSERT/UPDATE語句失敗。

1

絕對你在正確的軌道上。您應該在這裏創建日常分區並將數據存儲在其中,您的查詢將發生革命性變化並將像法拉利一樣運行。也看看本地索引。 也有分區,如果你以前的數據不會干擾,所以你可以保留或刪除它不會有太大的區別。事實上,而不是刪除,你可以簡單地刪除分區。這也是非常快的。