删除 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 小时”缩短了一半,我不会感到惊讶。

其他影响性能的因素有: “ENGINE=InnoDB 默认字符集=utf8;”

将其更改为:“ENGINE=MYISAM DEFAULT CHARSET=latin1;”可以将时间再次减少一半。

BIGINT 是 32 位机器上的性能杀手。64 位机器运行 MariaDB 的速度比 32 位机器快 2.5 倍。

相关内容