0

私の問題には次の2つの表があります。

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して、サブクエリで計算されたカウントに設定します。

このように記述されたクエリは、通常、サブクエリの結果の行が結合前に1回だけ計算されるため、より高速に実行されますが、ソリューションでは、サブクエリはユーザー行ごとに1回計算されます。

于 2012-12-15T08:19:42.277 に答える
2

DB上の多数のレコードを処理するときは、ワイルドカード( )を避け、インデックス*を利用する必要があります。

于 2012-12-15T08:04:43.180 に答える