大型 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 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCRMENT=1947722 ;
我有大约 200 万行,所以当我在这里对 R_status 进行更新时,似乎花费了太长的时间(R_status 是 1、2、16 或 24)。 请建议如何优化。
Hi this is my table structure
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 ;
I have approx 2 million rows so when I do an update on R_status here, it seem to take too long(R_status is either 1,2,16 or 24).
Please suggest on how to optimise.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果 R_status 始终为整数,则将其设为整数。
另外,我会尝试将此表转换为固定行宽格式(无 varchars/texts)
另外,在 R_smppid 上创建索引,否则它会在每次更新时进行全表扫描。
If R_status is always integer, make it integer.
Also, I would try to convert this table into fixed-row-width format (no varchars/texts)
Also, make index on R_smppid, without that it would do full table scan on each update.
正如 @BarsMonster 建议的那样,将
R_status
转换为整数(如果值仅为1,2,16,24
,则为TINYINT
),并创建一个 <R_smppid
上的代码>INDEX。另外,如果R_smppid
是固定宽度,请将字段类型更改为char(40)
或任何内容的长度,或者如果它可以转换为整数,那就是甚至更好。As @BarsMonster suggestd, convert
R_status
into an integer (TINYINT
if values are only1,2,16,24
), and create anINDEX
onR_smppid
. Also, ifR_smppid
is fixed width, change field type tochar(40)
or whatever the length of the content is, or if it can be converted into an integer, that's even better.