大型MySQL表更新速度慢

时间:2010-09-03 08:28:49

标签: mysql performance scalability sql-update

嗨,这是我的表结构

CREATE TABLE IF NOT EXISTS `sms_report` (
 `R_id` int(11) NOT NULL auto_increment,
 `R_uid` int(11) NOT NULL,
 `R_smppid` varchar(100) collate utf8_unicode_ci NOT NULL,
 `R_from` varchar(10) collate utf8_unicode_ci NOT NULL,
 `R_status` longtext collate utf8_unicode_ci NOT NULL,
 `R_message` text collate utf8_unicode_ci NOT NULL,
 `R_numbers` longtext collate utf8_unicode_ci NOT NULL,
 `R_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `R_timedate` varchar(40) collate utf8_unicode_ci NOT NULL,
 `R_show` int(11) NOT NULL default '1',
 `oldformat` tinyint(1) NOT NULL default '0',
 PRIMARY KEY  (`R_id`)

)ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci AUTO_INCREMENT = 1947722;

我有大约200万行所以当我在这里对R_status进行更新时,它似乎需要太长时间(R_status是1,2,16或24)。 请建议如何优化。

2 个答案:

答案 0 :(得分:3)

如果R_status总是整数,则将其设为整数。 另外,我会尝试将此表转换为固定行宽格​​式(无varchars /文本)

另外,在R_smppid上创建索引,而不是在每次更新时都进行全表扫描。

答案 1 :(得分:0)

正如@BarsMonster建议的那样,将R_status转换为整数(TINYINT,如果值仅为1,2,16,24),并在INDEX上创建R_smppid。此外,如果R_smppid是固定宽度,请将字段类型更改为char(40)或内容的长度,或者如果它可以转换为整数,那就更好了。