用于大数据比较的django数据库

时间:2012-02-05 23:44:36

标签: django database comparison large-data

我在django数据库中有一个大数据集(基于数字的数据,例如,200,000行数字),客户端将传入另一组数据,例如100-500个基于数字的数据,然后服务器需要从传入的数据中找出数据库中已有的数字。假设数字数据是电话号码。如果我只是进行常规数字比较,服务器甚至无法处理来自客户端的2-3个请求。

请为我的问题建议一些解决方案。

2 个答案:

答案 0 :(得分:3)

这些数字是唯一的吗?他们是否有钥匙?

SELECT num FROM table WHERE num IN (111,222,333,....500 numbers later..., 99999)

应该为您提供数据库中的数字列表,您可以使用该列表,将其与您的设置进行比较并获取差异。

大多数SQL数据库将采用一个大小的SQL语句,它实际上非常高效,而且,如果您只对实际存在感兴趣,那么数据库可能只是扫描索引并且从不命中实际行(取决于DB当然)。

所以,尝试一下,看看它是如何工作的。如果你的数字没有编入索引,那么你就注定要在门口注定 - 也要修复它。

附录:

简单地说,如果您的号码是唯一的,您需要确保在数据库中有该数字列的索引。如果你想强制它保持唯一,你可以使它成为一个独特的索引,但现在需要:

CREATE UNIQUE INDEX i1 ON table(num)

如果您没有索引,db将继续扫描表的所有行,这不是您想要的。

而且,是的,111,222,333是您正在检查的客户传递的数字。

假设你的数据库中有数字1,2,3,4,5,6,客户端列表是1,5,7。当您执行SELECT num FROM表WHERE num IN(1,5,7)时,您将返回2行:1和5。

所以,你需要比较结果数,1,5到你的名单,1,5,7。我不太了解Python,更不用说Django了,给你一个很好的例子,但是快速浏览一下就会发现它们已经“设置”了对象。有了这些,你可以这样做:

newSet = clientSet.difference(dbSet)

其中clientSet是来自客户端的数字集,dbSet是给定查询中的数字集,而newSet是客户端不在数据库中的数字列表。

我可能会滥用集合运营商的“差异”,但这就是它的主旨。

答案 1 :(得分:1)

如果要检查查询是否与任何行匹配,请在查询集中使用count();这样可以避免评估查询集(从而执行查询),从而可以提高性能。

不要这样做:

result = Entry.objects.filter(number__in=[1,2,3,4,5,6,7])
if len(result):
   print "We have some results!"

相反:

result = Entry.objects.filter(number__in=[1,2,3,4,5,6,7])
if result.count():
   print "We have some results!"

根据Will的建议 - 您还应该确保表中的索引与您要搜索的列相对应。