Mysql update语句执行得太慢

时间:2012-12-15 07:51:30

标签: mysql sql-update

我的问题中有两个表格如下。

CREATE TABLE `t_user_relation` (
  `User_id` INT(32) UNSIGNED NOT NULL  ,
  `Follow_id` INT(32) UNSIGNED NOT NULL ,
  PRIMARY KEY (`User_id`,Follow_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `t_user_info`(
    `User_id` int(32) unsigned NOT NULL  ,
    `User_name` varchar(20) NOT NULL ,
    `User_avatar` varchar(60) NOT NULL ,
    `Msg_count` int(32) unsigned DEFAULT '0' ,
    `Fans_count` int(32) unsigned DEFAULT '0' ,
    `Follow_count` int(32) unsigned DEFAULT '0' ,
    PRIMARY KEY (`User_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

我要做的是更新t_user_info表的Fans_count字段。我的更新声明如下:

 UPDATE t_user_info set t_user_info.Fans_count=(SELECT COUNT(*) FROM t_user_relation
 WHERE t_user_relation.Follow_id=t_user_info.User_id);

但它执行得非常慢!表t_user_info包含20,445条记录,t_user_relation包含1,809,915条记录。任何人都可以帮助我提高速度!感谢您的任何建议!

2 个答案:

答案 0 :(得分:3)

我会试试这个:

UPDATE
  t_user_info inner join
  (SELECT Follow_id, COUNT(*) as cnt
   FROM t_user_relation
   GROUP BY Follow_id) s
  on t_user_info.User_id=s.Follow_id
SET t_user_info.Fans_count=s.cnt

我正在使用子查询来计算表Follow_id中每个t_user_relation的行数:

SELECT Follow_id, COUNT(*) as cnt
FROM t_user_relation
GROUP BY Follow_id

然后我使用t_user_info加入此查询的结果,我正在更新连接成功的Fans_count,将其设置为子查询中计算的计数。

这样写的查询通常运行得更快,因为子查询中的结果行只在连接之前计算一次,而在解决方案中,子查询每个用户行计算一次。

答案 1 :(得分:2)

在处理数据库中的大量记录时,您希望远离通配符(*)并使用indexes