0

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

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 条记录。谁能帮我提高速度!感谢您的任何建议!

4

2 回答 2

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连接成功的位置,将其设置为在子查询中计算的计数。

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

于 2012-12-15T08:19:42.277 回答
2

在处理数据库上的大量记录时,您希望远离通配符 ( *) 并利用索引

于 2012-12-15T08:04:43.180 回答