SQL

Принцип БД для поиска из 3 млрд строк.

Каждая строка число от 1 млрд до 4 млрд. И при добавлении новой надо проверять нету ли уже в БД его.
Как это делается правильно?
например сперва есть 10 разделов, в первое числа по маске 30*********, во втором 31******* и тд.
Потом в первом разделе еще 10 разделов, где первый 300*****, второй 301******* и тд
и так далее что бы было куча "папок" - тогда будет "летать"?
Правильно это делается хранением данных в документоориентированной БД, или другой NoSQL. Они заточены под большие/гигантские объемы записей и производительность.
SQL-решение так или иначе доставит проблем когда данных станет слишком много. Просто у разных систем разные пороговые значения, за которыми эти траблы начинают проявляться.

// Возможно лучше подойдет CO DBMS, чем DO DBMS - в зависимости от данных, и набора операций (которые определят и тип хранилища, и структуру, и набор индексов). Желательно со спецами по этим самым нереляционкам проконсультироваться, так как общих ответов на такие вопросы не бывает: надо учитывать индивидуальные факторы.
Гани Базылов
Гани Базылов
55 445
Лучший ответ
>Каждая строка число от 1 млрд до 4 млрд. И при добавлении новой надо проверять нету ли уже в БД его.
Делаешь на это поле уникальный индекс и адью.

>например сперва есть 10 разделов, в первое числа по маске 30
А это уже несколько другая задача. Для таких данных используются partitioned tables, и ты их тоже используй, юный падаван.
1. Если у тебя числа, то и хранить их надо как числа - в базе данных.

2. Нет, noSQL (если это не ключ=>значение) использовать для этой задачи не имеет смысла. Банальная реляционная СУБД, где твои числа являются первичным ключом таблицы.

3. А для ускорения выборки таблицу можно секционировать: например, используя частное от деления твоих чисел на 10 млн или остаток от деления на 300: получишь 300 секций по, максимум, 10 млн записей каждая - такое даже в MySQL будет работать очень быстро.
РЮ
Радик Юнусов
56 962
Илья Погодин >> Нет, noSQL (если это не ключ=>значение) использовать для этой задачи не имеет смысла.
Если у него кроме этих чисел больше ничего не хранится, то в использовании вообще любой СУБД маловато смысла - в таком случае, банальное файловое хранилище на апи ОС будет более адекватно задаче.
Но если помимо этой таблички у него в БД есть и другие, тоже с ~3 млрд. записей каждая, то SQL будет сосо.
Если нужно проверять только факт принадлежности числа множеству, то для 4 миллиардов это можно сделать битовым массивом на ~500 мегабайт. Операция проверки наличия одного числа и добавления/удаления числа будет иметь гарантированную сложность О (1). Но вывести на экран все элементы этого множества будет сложно, придётся перебирать весь битовый массив.
В базах данных есть такая штука: индекс. Индексы сильно ускоряют поиск. В данном случае хорошо подойдёт индекс-ориентированная таблица. Ещё многие СУБД позволяют разбить таблицу на разделы (partitions).
Юрий Реуцкий
Юрий Реуцкий
58 065