2012-04-04 28 views
2

我正在构建一个遍历twitterusers的脚本,分析他们的推文语言,并且如果找到正确的语言,所有朋友和追随者都会添加到队列中。这些用户反过来从队列中挑选出来,并且一次又一次地执行该过程。为了保持数据库的快速,我使用同一个表,用于用户在队列中可以拥有的所有不同状态(“要分析语言”= 1,“要获取”= 2,“进行中”= 9, “完成”= 99和“被阻止”= -1)。这样我就可以将所有朋友/追随者添加到表格中,而无需检查表格中是否已存在该人员(每个Twitter用户当然只能分析一次)。在mysql中优化队列

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 

然后我做所有的魔法,终于改变queuetype到一个新的queuetype(完成,被阻止等)。

该解决方案是否可以进一步优化? “SELECT tid”非常慢,需要几秒钟才能运行。如果我给k添加索引,选择会变得更快,但更新变得非常慢,结果会更糟。

如何进一步优化这种类型的队列?我应该考虑一个不同的设计?不同的数据库?所有的解决方案,欢迎:)

[编辑]

引擎是MyISAM的

EXPLAIN队列

tid int(11) NO PRI  
queuetype tinyint(1) NO   
k mediumint(6) unsigned NO   
+0

也许你可以扩大一点你的索引?它是什么类型?你使用什么存储引擎?如果您尝试使用EXPLAIN PLAN,您会得到什么?之类的东西。 – 2012-04-04 09:28:29

+0

编辑的消息。谢谢! – 2012-04-04 11:54:19

回答

0

我想建议,如果你想快速INSERT性能,只想要搜索的精确匹配,那么你需要一个哈希索引。但仔细阅读文档here,我发现散列索引仅适用于NDB存储引擎。

我对这种存储引擎一无所知,所以会毫不犹豫地推荐它,但如果不是太不方便,可能值得一试。请参阅here

+0

有意思,会查它!但实际上,SELECT是慢的,而不是INSERT。 INSERTs速度很快...... – 2012-04-04 17:02:01