在 10GB+ InnoDB 表上刪除索引需要 4 小時以上

在 10GB+ InnoDB 表上刪除索引需要 4 小時以上

這是我正在使用的表:

CREATE TABLE IF NOT EXISTS `checklist_answer` (
  `id` varchar(36) NOT NULL,
  `created_by` varchar(36) NOT NULL,
  `date_created` datetime NOT NULL,
  `updated_by` varchar(36) NOT NULL,
  `date_updated` datetime NOT NULL,
  `deleted` int(11) NOT NULL,
  `checklistresponse_id` varchar(36) NOT NULL,
  `question_id` varchar(36) NOT NULL,
  `questionoption_id` varchar(36) DEFAULT NULL,
  `value` varchar(256) NOT NULL,
  `source` int(11) NOT NULL,
  `award_id` varchar(36) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `checklist_answer_1f92e550` (`question_id`),
  KEY `checklist_answer_35e0d13d` (`questionoption_id`),
  KEY `answerset` (`checklistresponse_id`,`deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

目前表格大約有 2000 萬行,大小約 12GB。每當我嘗試新增索引或刪除索引時,至少需要 4 小時。我是否做錯了什麼明顯的事情,或者事實就是如此?

MySQL 5.1.49

謝謝!

答案1

如果您使用MySQL 5.1的內建InnoDB,那麼索引的建立和刪除非常慢。這個問題在 5.5 中得到了解決快速索引。如果可能的話更新 MySQL。或者你也可以使用 InnoDB 外掛程式取代 5.1 內建的 InnoDB(雖然這應該已經完成;鑑於您遇到這個問題,它可能在某種程度上沒有完成)。

答案2

查看您正在索引的三個 36 位元組“ID”欄位。

我首先建議將這三個減少到 8 位元組 UNSIGNED BIGINT;如果 40 億的數字足夠大,則 4 位元組 UNSIGNED INT 甚至更好。

如果 4 位元組 INT「已刪除」欄位被用作標誌,則可以將其變更為 1 位元組 TINYINT。

您可以嘗試發出:


更改表checklist_answer禁用鍵;

/*

 Make you table changes in here.

*/

更改表checklist_answer啟用鍵;


總的來說,如果「4 小時」縮短了一半,我不會感到驚訝。

其他影響性能的因素包括: “引擎=InnoDB預設字元集=utf8;”

將其更改為:“ENGINE=MYISAM DEFAULT CHARSET=latin1;”可以再次將時間縮短一半。

BIGINT 是 32 位元機器上的效能殺手。 64 位元機器的 MariaDB 運作速度比 32 位元機器快 2.5 倍。

相關內容