【问题标题】:Large MySQL Table Update Slow大型 MySQL 表更新慢
【发布时间】:2011-04-07 17:46:14
【问题描述】:

你好,这是我的表结构

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)。 请建议如何优化。

【问题讨论】:

  • 您是否仅根据WHERE 子句中的R_id 进行更新?或其他列?你能发布一个示例UPDATE 查询吗?
  • 示例更新查询将是 update sms_report set R_status=1 where R_smppid=738sbdasdbajsdbdfbfbks782|9898773122

标签: mysql performance scalability sql-update


【解决方案1】:

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

【讨论】:

  • 当您创建索引时,数据库引擎会缓存已排序的字段版本,以便根据请求轻松快速地查找,因此当您下次执行UPDATE.. WHERE indexed_field=value 时,数据库会更快地找到该行,并且更新它,看看这里:dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
【解决方案2】:

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

另外,在 R_smppid 上建立索引,否则它会在每次更新时进行全表扫描。

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2021-12-13
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多