我正在构建一个遍历twitterusers的脚本,分析他们推文的语言,如果找到正确的语言,所有朋友和关注者都会被添加到队列中。然后从队列中挑选这些用户,并且一次又一次地执行该过程。为了保持数据库快速,我使用相同的表用于队列中用户可以拥有的所有不同状态(“要分析语言”= 1,“要获取”= 2,“进行中”= 9, “完成”= 99并且“阻止”= -1)。这样我就可以将所有朋友/粉丝添加到表中而无需检查表中是否已存在该人(当然每个Twitter用户只应进行一次分析)。
INSERT IGNORE INTO queue (tid,queuetype) VALUES (1,1),(2,1) ... (xxx,1);
这很快。但是随着表的增长(几百万行)从队列中选择下一个用户,它变得越来越慢。
现在,我这样做($ uniqueid实际上是进程号):
UPDATE queue SET k='$uniqueid', queuetype = '9' WHERE k='0' AND queuetype = '1' LIMIT 1
接下来是:
SELECT tid FROM queue WHERE k='$uniqueid' LIMIT 1
然后我做了所有的魔法,最后将队列类型更改为新的队列类型(完成,阻止等)。
可以进一步优化解决方案吗? “SELECT tid”非常慢,需要几秒钟才能运行。如果我向k添加索引,选择变得更快但更新变得非常缓慢,结果更糟。
如何进一步优化此类队列?我应该考虑不同的设计吗?不同的数据库?欢迎所有解决方案:)
[编辑]
引擎是Myisam
EXPLAIN队列
tid int(11) NO PRI
queuetype tinyint(1) NO
k mediumint(6) unsigned NO