2012-02-05 55 views
1

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

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

回答

3

数字是唯一的吗?他们是否被锁定?

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

应该给你,是在DB号码列表,你采取的列表,它比较对你的一套,并采取差异。

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

所以,试试看看它是如何工作的。如果你的号码没有编入索引,那么你注定会在门口 - 也解决这个问题。

附录:

简单地说,如果你的号码是唯一的,你需要确保你在你的数据库对这个数字的列的索引。如果要强制执行,它仍然是独一无二的,你可以把它的唯一索引,但现在要求:

CREATE UNIQUE INDEX i1 ON table(num) 

如果没有索引,数据库会不断扫描所有的行表,这不是你想要的。

而且,是的,111222333是从你正在检查客户端传递的数字。

比方说,你有你的数据库1,2,3,4,5,6号,和客户的名单是1,5,7。当您执行SELECT NUM FROM表,其中num IN(1,5,7),你会得到2行:1和5

所以,你需要比较的结果数,1,5你名单,1,5,7。我不知道足够多的Python,更不用说Django,给你一个很好的例子,但是快速浏览显示他们有'设置'对象。有了这些,你可以这样做:

newSet = clientSet.difference(dbSet) 

其中clientSet是一组从客户端号码,dbSet是给定一组从查询号码,并newSet是号码列表,该客户端不在分贝。

我可能会滥用集合运算符“差异”,但这是它的要点。

+0

您好,感谢您的回答,我是数据库新手。但是,数字是独一无二的。我不确定“键控”是如何工作的,但我会研究它。关于您在答案中提供的查询的另一个问题是,111,222,333,... 500是从客户端传递的数字? – triston 2012-02-06 01:29:38

+0

这真的很有帮助,我将两个解决方案结合起来,并试图理解它们。这是一个非常详细的解释,非常感谢您在我的问题上发送的所有内容。 – triston 2012-02-07 05:43:08

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!" 

正如威尔建议 - 你也应该确保你有正确的索引在你对列,你将表搜索。

+0

谢谢,我会尝试你的建议。 – triston 2012-02-07 00:56:20