StrangeAttractor
@StrangeAttractor

Какую СУБД выбрать для хранения одной большлй таблицы?

Будет одна большая (от нескольких миллионов до десятков миллионов записей, полей не много и сами поля сравнительно маленькие, объём таблицы в гигабайтах — ну те же от нескольких гигабайт до нескольких десятков гигабайт (если ткнуть пальцем в небо глядя на предыдущие реализации (на MySQL InnoDB))) таблица. Первичный ключ — составной из нескольких естественных ключей (типа кода страны по ISO 3166, года, и т.п.).

Надо иметь возможность относительно быстро делать из неё произвольные выборки по любым обычным логическим фильтрам по всем полям, очень желательно иметь индексы по колонкам первичного ключа для быстрой выборки (заостряю на этих вещах внимание т.к., вроде, не во всех NoSQL это есть). Записи практически никогда не меняются, только добавляются, обычно большими пачками. Клиентов немного (не high-load), но высокая скорость лишней не будет.

Желательно, чтобы одну и ту же базу (в смысле файлы, в которых она хранится) можно было без труда перетаскивать с компа на комп и использовать под разными ОС (скажем в MySQL такого добиться, вроде, не просто).

Основной язык программирования в проекте — Scala, основная платформа — 32-bit x86 (т.е. объём оперативной памяти в общем случае, на сколько я понимаю, ограничен двумя-тремя гигабайтами).

Рассматриваю и SQL и NoSQL варианты. Опыта в NoSQL — абсолютный ноль, так что не судите строго.

Заранее спасибо за подсказки.
  • Вопрос задан
  • 4637 просмотров
Пригласить эксперта
Ответы на вопрос 5
@Vampiro
Объемы данных принято измерять мега-, гига-, тера-, пета- байтами, но никак не строками. 10 кк строк — это не проблемный объем данных для любой БД, хоть sqlite. До тех пор, пока они вмещаются в оперативку и вы не надумаете масштабировать решение на 2-3 сервера, можете брать то, что вам роднее и ближе. Не выбирайте мускуль, если для вас сложно там скопировать данные с компа на комп.

Куда больше на выбор влияет кластеризация (если есть данные, которые редко дергаются — их лучше положить на винт из оперативки)
Репликация (отказоустойчивость)
Бекапы, миграции, и прочее. А дергать одну табличку… пф)
Ответ написан
@sphinks
Немного расскажу про NoSQL: основная фишка этих баз (по крайней мере DynamoDB, с которой я работаю) возможность масштабирования при росте записей с распределением нагрузки на несколько DB серверов. Выборка по произвольному фильтру напрямую будет очень не эффективна и близка к полному перебору, придется придумывать дополнительные «индексные» таблицы. Отсюда и получается если база будет расти и желательно потом это все отрабатывать с примерно той же скоростью, то nosql в облаке был бы неплох, но у вас как я понимаю все локально по идее с одним пользователем, в этом случае смотри на SQL базы.
Ответ написан
Комментировать
StrangeAttractor
@StrangeAttractor Автор вопроса
В оперативку вся таблица не влезет как ни крути (вопрос уточнил, спасибо за замечания). Про sqlite, честно говоря, не верю, что она будет сколько-нибудь хорошо, скажем, даже на 5-гигабайтном файле проворачиваться. При желании (которым не горю, ибо Оккам не велит) можно легко осмысленно разбить на несколько частей. Репликация, миграция, бэкапы — грубо говоря не нужны (по природе задачи: ценность хранимых данных очень низкая т.к. всегда можно приостановить production и восстановить из первичного источника, количество клиентов тоже низкое (<100)). Меня интересуют возможности запросов по условиям по колонкам, скорость (работы с многогигабайтной таблицей при использовании не более двух (лучше — одного, чтобы нормально на ноутбуке ворочалось и другим процессам не сильно мешало) гигабайта оперативки) и лёгкость освоения. Когда смотрел сравнения NoSQL-субд смутило то, что некоторые — column-based (как я понимаю то, что мне нужно), некоторые — document-based (как я понимаю (но чую, что как минимум не совсем прав) тут делать запросы по колонкам нельзя), некоторые key-value. Судя по схеме imgur.com/kyahZ мне больше всего подходит Vertica, но она, на сколько я понимаю, платная и не особо поддерживается сообществом.
Ответ написан
@gelas
По-моему, тут нет слысла менять СУБД.
Под описание SQL решение подходит практически идеально.
С document-based NoSQL наверняка получите больший объем на тех же данных, т.к. как там струкрура документа хранится в каждом документе.
Про colum-based NoSQL ничего не скажу, но хранить оптимальнее чем в SQL СУБД врядли получится.
Соответственно медленне может стать только из-за большего объема, плюс при отсутствии опыта могут вылазить непредвиденные проблемы.
Я думаю, лучшим вариантом будет просто правильно пооптимизировать существующее решение и разобраться с переносом, что вроде бы не особенно сложно, да и инструкции есть
Ответ написан
opium
@opium
Просто люблю качественно работать
1-10 миллионов записей фигня, хоть mysql, хоть mongo, хоть в файле храни правильно.
Количество данных ни о чем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы