2016-07-26 5 views
1

Я пишу приложение Django, которое будет иметь записи, введенные пользователями сайта. Теперь предположим, что все идет хорошо, и я получаю ожидаемое количество посетителей (маловероятно, но я планирую будущее). Это приведет к сотням миллионов записей в одной базе данных PostgreSQL.Хранение записей в очень большой базе данных

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

Является ли группировка записей в наборах (допустим) 100 лучшей идеей для хранения этих многих записей? Или есть лучший способ, которым я мог бы это оптимизировать?

+2

Я не уверен, что вы просите. Зачем вам нужно перебирать записи? Базы данных отлично подходят для поиска, вот для чего они нужны. –

+0

@ DanielRoseman, но верно делать то же самое действие несколько раз в минуту - плохая идея? – techydesigner

+0

* Что * операция? –

ответ

1

Храните по одному, пока вы абсолютно не можете больше, а затем создайте что-нибудь еще вокруг своей конкретной проблемы.

SQL - это декларативный язык, что означает «дать мне все записи, соответствующие X», не сообщает серверу db как для этого. Следовательно, у вас есть много способов помочь серверу db сделать это быстро, даже если у вас сотни миллионов записей. Кроме того, РСУБД оптимизированы для этой проблемы на протяжении многих лет опыта, поэтому до определенного момента вы не будете бить такую ​​систему, как PostgreSQL.

Как говорится, преждевременная оптимизация - это корень всего зла.

Итак, давайте посмотрим на два пути: PostgreSQL может пройти через таблицу, чтобы дать вам результаты.

Первый - это последовательное сканирование, в котором он выполняет итерацию по ряду страниц, просматривает каждую страницу для значений и возвращает записи вам. Это работает лучше, чем любой другой метод для очень маленьких таблиц. Он медленный на больших таблицах. Сложность - это O (n), где n - размер таблицы, для любого количества записей.

Таким образом, вторым подходом может быть сканирование индекса. Здесь PostgreSQL пересекает серию страниц в индексе b-дерева для поиска записей. Сложность - это O (log (n)), чтобы найти каждую запись.

Internal PostgreSQL хранит строки в партиях с фиксированными размерами, как страницы. Он уже решает эту проблему для вас. Если вы попытаетесь сделать то же самое, у вас есть партии записей внутри партий записей, которые обычно являются рецептом для плохих вещей.

+0

Отличный ответ помощник. Очень информативно. Огромное спасибо! – techydesigner

+1

btw, я работаю с dbs, содержащими сотни миллионов строк общим размером 10TB +. Бывают случаи, когда какое-то денормализованное хранилище полезно, но на вашем этапе вы, вероятно, не будете иметь представление о том, что на самом деле может вас укусить, а денормализация на будущее - это обычно способ создания проблем –