2010-09-03 91 views
0

你好,这是我的表结构大MySQL表更新慢

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的默认字符集= UTF8 COLLATE = utf8_unicode_ci AUTO_INCREMENT = 1947722;

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

+0

您是仅基于WHERE子句中的R_id更新的吗?或其他列?你可以发布一个样例'UPDATE'查询吗? – aularon 2010-09-03 08:39:57

+0

示例更新查询将为 update sms_report set R_status = 1其中R_smppid = 738sbdasdbajsdbdfbfbks782 | 9898773122 – 2010-09-03 08:42:17

回答

0

作为@BarsMonster suggestd,转换R_status成整数(TINYINT如果值仅1,2,16,24),和创建一个R_smppidINDEX。另外,如果R_smppid是固定宽度,请将字段类型更改为char(40)或内容长度,或者如果可以将其转换为整数,则更好。

+0

什么是索引? – 2010-09-03 08:50:11

+0

创建索引时,数据库引擎会缓存一个订购字段的版本,以便根据请求进行简单快速的查找,因此,当您下次执行'UPDATE .. WHERE indexed_field = value'时,数据库会更快地找到该行并更新它,看看这里:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – aularon 2010-09-03 09:05:40

3

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

此外,使R_smppid上的索引,没有它将执行每个更新的全表扫描。