如何加速MySQL数据库/查询?

Pr0*_*0no 2 php mysql sql myisam

我的MySQL数据库中有两个表,用户和推文,如下所示:

TABLE users (
  uid int(7) NOT NULL AUTO_INCREMENT,
  twitter_uid int(10) NOT NULL,
  screen_name varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  tweets int(6) NOT NULL,
  followers_count int(7) NOT NULL,
  statuses_count int(7) NOT NULL,
  created_at int(10) NOT NULL,
  PRIMARY KEY (uid)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

TABLE tweets (
  tweet_id int(11) NOT NULL AUTO_INCREMENT,
  `query` varchar(5) NOT NULL,
  id_str varchar(18) NOT NULL,
  created_at int(10) NOT NULL,
  from_user_id int(11) NOT NULL,
  from_user varchar(256) NOT NULL,
  `text` text NOT NULL,
  PRIMARY KEY (tweet_id),
  KEY id_str (id_str)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

推文表包含超过200万条记录.我已将唯一用户(取自tweets.from_user)放在users表中.它现在包含94,100个用户.我现在想要计算每个用户发布的推文数量,如下所示(在PHP中):

res = db_query('SELECT uid, screen_name FROM users WHERE tweets = 0 LIMIT 150');
while ($user = db_fetch_object($result)) {
  $res2 = db_query(
    "SELECT COUNT(tweet_id) FROM tweets WHERE from_user = '%s'",
    $user->screen_name
  );
  $cnt = db_result($result2);
  db_query("UPDATE users SET tweets = %d WHERE uid = %d", $cnt, $user->uid);
}
Run Code Online (Sandbox Code Playgroud)

但是,这段代码非常慢.计算150个用户的推文大约需要5分钟.按此速率,所有用户完成此任务大约需要3天.

我的问题是 - 我必须在这里遗漏一些东西.也许有更高效的查询可能,或者我应该改变一些数据库结构?任何帮助将不胜感激 :)

mar*_*pin 6

我认为这里最糟糕的问题是有多个查询.这很可能比索引问题更糟糕.您应该尝试只有一个查询.

UPDATE users 
SET users.tweets = (SELECT COUNT(tweet_id) 
                    FROM tweets 
                    WHERE tweets.from_user = users.uid 
                    AND users.tweets =0
                   )
Run Code Online (Sandbox Code Playgroud)