我的问题中有两个表格如下。
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条记录。任何人都可以帮助我提高速度!感谢您的任何建议!
答案 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。