这是我正在使用的表格:
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。 每当我尝试添加一个新的索引,或删除一个索引,至less需要4个小时。 有没有什么明显的,我做错了或是它是如何?
MySQL 5.1.49
谢谢!
如果你使用的是MySQL 5.1的内置InnoDB,那么索引的创build和删除非常慢。 在5.5中用快速索引来解决这个问题。 如果可能,更新MySQL。 或者你也可以用InnoDB插件replaceInnoDB中的InnoDB (尽pipe这应该已经完成了,假设你有这个问题,那么可能不知道)。
看看你正在进行INDEXING的三个36字节的“ID”字段。
我首先build议将这三个降低到8字节的UNSIGNED BIGINT; 如果一个40亿个数字足够大的话,4个字节的UNSIGNED INT会更好。
如果4字节INT“已删除”字段被用作标志,则可以将其更改为1字节TINYINT。
你可以尝试发行:
ALTER TABLE checklist_answer DISABLE KEYS;
/ *
Make you table changes in here.
* /
ALTER TABLE checklist_answer ENABLE KEYS;
看到“四小时”减半,我一点也不惊讶。
其他性能杀手这里是: “ENGINE = InnoDB DEFAULT CHARSET = utf8;” 。
将其更改为:“ENGINE = MYISAM DEFAULT CHARSET = latin1;” 可以再减less一半的时间。
BIGINTs是32位机器上的性能杀手。 64位机器将运行MariaDB比32位机器快2.5倍。