在mysql中优化队列

时间:2012-04-04 09:05:17

标签: mysql queue

我正在构建一个遍历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          

1 个答案:

答案 0 :(得分:0)

我建议如果你想要快速INSERT性能并且只想搜索完全匹配,那么你需要一个散列索引。但是仔细阅读文档here,我了解到散列索引仅适用于NDB存储引擎。

我对这个存储引擎一无所知,所以会毫不犹豫地推荐它,但如果它不太不方便的话可能值得一试。

另见here