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天.
我的问题是 - 我必须在这里遗漏一些东西.也许有更高效的查询可能,或者我应该改变一些数据库结构?任何帮助将不胜感激 :)
我认为这里最糟糕的问题是有多个查询.这很可能比索引问题更糟糕.您应该尝试只有一个查询.
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)
| 归档时间: |
|
| 查看次数: |
1682 次 |
| 最近记录: |