Какая самая оптимальная БД для хранения больших объемов информации?
Нужно хранить несколько десятков (а то и сотен) миллионов записей в таблице базе данных, штук 5-8 полей, типы например такие - bigint, string, bool, integer, float. Для быстрого поиска нужна индексация по полям id, и title. При этом требуется, чтобы база данных на диске занимала как можно меньше места. Возможно есть какие-нибудь бенчмарки СУБД, в которых тестируется размер базы данных при одинаковом содержимом?
1. Миллионы записей это вовсе НЕ большая БД. Для современной СУБД - это ерунда. Нынче и миллиарды записей не большая проблема, а вы о миллионах каких-то.
2. В БД очень много места занимают индексы. Если вы не будете их делать (и не будете использовать СУБД, которая сама создает индексы) - можете сэкономить и в 2 раза. Как вариант - индексировать каждый раз при запуске приложения.
3. Касается только постоянно изменяемой БД. В БД очень много места занимает журнал транзакций. Если использовать СУБД без журнала транзакций - сэкономите размер, но потеряете в надежности. Если изменения происходят редко и в небольших объемах - проблемы с этим нет.
4. Есть append only СУБД. Там нет фрагментации. Там нет журнала транзакций (или он сильно упрощен).
5. У вас не такие уж и большие объемы. Допустим даже у вас будет 8 строковых полей по 120 символов в каждом. Это около килобайта без индексов. Допустим их будет 1 миллион. Это около 1 гигабайта без индексов.
6. Можно прекрасно разместить в оперативной памяти.
Если нужно прям-таки жестко сэкономить на дисковом пространстве, например, я бы взял СУБД in-memory (1 гигабайт данных + индексы на полгигабайта даже если - это не много для современного компьютера). А данные бы сжимал.
извините, немного ошибся в описании, я имел в виду десятки и сотни миллионов записей. Я в курсе что теоретически это не много, но когда размер таблицы mysql становится 20-30 Гб, то хотелось бы найти что-то поэкономнее именно с точки зрения хранения данных на диске :)
skylabs: Также было бы неплохо присмотреться на то - а какие данные не изменяются вовсе. Или изменяются крайне редко. В этом есть задел для оптимизации.
bnytiki: Минимизировать ID - это сэкономит индекс на ID.
Возможно, достаточно по частичному Name искать, а не по полному (например, по первым 10 символам) - тогда и для индексации использовать только начало Name.
Есть еще индексы разного типа, тут тоже можно повыбирать. Пусть они будут работать чуть медленнее, но будут занимать значительно меньше времени.
skylabs: Насколько я понял из описания - у вас почти что Key-Value хранилище.
Имхо, реляционная СУБД будет избыточна.
Что-то ближе к key-value без SQL-фич, умозрительно-предположительно, было бы эффективнее по расходу дискового пространства.
ок, спасибо, вот это как раз и интересует, может уже есть результаты проведенных тестов на одном и том же наборе данных, по которым было бы видно размер "накладных расходов" формата хранение данных в разных СУБД и движках.
skylabs:
Если у вас однопользовательская среда, то имеет смысл глянуть на файловые вещи. Вплоть до Berkley DB и т.п. А также на встраиваемые. Типа BoltDB и т.п.