我有在Django數據庫中的大的數據集(基於數量的數據,例如,200,000行號碼),並且客戶端將在另一組數據的傳遞,例如100-500個基於數字的數據,那麼服務器需要從傳入的數據中找出數據庫中已有的數字。假設數字數據是電話號碼。如果我只是進行常規數字比較,服務器甚至不能處理來自客戶端的2-3個請求。django的數據庫用於大型數據比較
請爲我的問題建議我一些解決方案。
我有在Django數據庫中的大的數據集(基於數量的數據,例如,200,000行號碼),並且客戶端將在另一組數據的傳遞,例如100-500個基於數字的數據,那麼服務器需要從傳入的數據中找出數據庫中已有的數字。假設數字數據是電話號碼。如果我只是進行常規數字比較,服務器甚至不能處理來自客戶端的2-3個請求。django的數據庫用於大型數據比較
請爲我的問題建議我一些解決方案。
數字是唯一的嗎?他們是否被鎖定?
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是號碼列表,該客戶端不在分貝。
我可能會濫用集合運算符「差異」,但這是它的要點。
如果您要檢查如果查詢匹配的任何行,在你的查詢集使用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!"
正如威爾建議 - 你也應該確保你有正確的索引在你對列,你將表搜索。
謝謝,我會嘗試你的建議。 – triston 2012-02-07 00:56:20
您好,感謝您的回答,我是數據庫新手。但是,數字是獨一無二的。我不確定「鍵控」是如何工作的,但我會研究它。關於您在答案中提供的查詢的另一個問題是,111,222,333,... 500是從客戶端傳遞的數字? – triston 2012-02-06 01:29:38
這真的很有幫助,我將兩個解決方案結合起來,並試圖理解它們。這是一個非常詳細的解釋,非常感謝您在我的問題上發送的所有內容。 – triston 2012-02-07 05:43:08