这是我正在使用的表:
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 小时”缩短了一半,我不会感到惊讶。
其他影响性能的因素有: “ENGINE=InnoDB 默认字符集=utf8;”。
将其更改为:“ENGINE=MYISAM DEFAULT CHARSET=latin1;”可以将时间再次减少一半。
BIGINT 是 32 位机器上的性能杀手。64 位机器运行 MariaDB 的速度比 32 位机器快 2.5 倍。