База данных Django для сравнения больших данных - PullRequest
1 голос
/ 06 февраля 2012

У меня большой набор данных (данные на основе чисел, например, 200 000 строк чисел) в базе данных django, и клиент передаст другой набор данных, например, 100-500 частей данных на основе чисел, затем сервер должен выяснить, какие номера уже есть в базе данных, из переданных данных. Допустим, данные о номерах являются телефонными номерами. Если я просто сделаю сравнение обычных чисел, сервер не сможет обработать 2-3 запроса от клиентов.

Пожалуйста, предложите мне решение моей проблемы.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

Уникальны ли числа? Они набраны?

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

Если вы получите список чисел в БД, вы возьмете этот список, сравните его с вашим набором и возьмите разницу.

Большинство БД SQL будут принимать оператор SQL такого размера, который на самом деле достаточно производительный, и, если вас интересует только фактическое существование, БД, скорее всего, просто просканирует индекс и никогда не попадет в реальные строки (зависит от БД конечно).

Итак, попробуйте это и посмотрите, как это работает. Если ваши номера не проиндексированы, то вы обречены на врата - исправьте это тоже.

Addenda:

Проще говоря, если ваш номер уникален, вам нужно убедиться, что у вас есть индекс для столбцов этого номера в вашей базе данных. Если вы хотите, чтобы он оставался уникальным, вы можете сделать его уникальным индексом, но теперь это необходимо:

CREATE UNIQUE INDEX i1 ON table(num)

Если у вас нет индекса, БД будет непрерывно сканировать все строки таблицы, а это не то, что вам нужно.

И, да, 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 голос
/ 06 февраля 2012

Если вы хотите проверить, соответствует ли запрос какой-либо строке, используйте 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!"

По предложению Уилла - вы также должны убедиться, что в ваших таблицах есть правильные индексы для столбцов, по которым вы будете искать.

...