這是我正在使用的表:
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 倍。