Ваш вопрос о «распределенном», но я вижу более серьезные вопросы, которые должны отвечать в первую очередь.
«Высокоиндексированный 5ТБ» будет замедлять сканирование. Индекс - это BTree. Чтобы добавить новую строку в индекс, нужно найти блок в том дереве, где находится элемент, а затем прочитать-изменить-записать этот блок. Но...
Если индекс AUTO_INCREMENT
или TIMESTAMP
(или подобные вещи), то блоки модифицируются являются «всегда» на «конец» в BTree. Таким образом, практически все чтения и записи можно кэшировать. То есть, обновление такого индекса очень невелико.
Если индекс «случайный», такой как UUID, GUID, md5 и т. Д., То блок для обновления - редко найден в кеше. То есть, обновление этого одного индекса для этой одной строки может стоить пара IOP. Даже с твердотельными накопителями вы, скорее всего, не справитесь. (Предполагая, что у вас нет нескольких ТБ ОЗУ.)
Если индекс находится где-то между последовательным и случайным (скажем, каким-то «именем»), тогда могут быть тысячи «горячих точек» в BTree, и они могут быть кэшируемыми.
Итог: если вы не можете избежать случайных индексов, ваш проект обречен.
Следующий номер ... Запросы. Если вам нужно сканировать 5TB на SELECT
, то будет потребуется время. Если это тип приложения хранилища данных, и вам нужно, скажем, суммировать данные за прошлый месяц, то создание и поддержание сводных таблиц будет очень важным. Более того, это может устранить необходимость в некоторых индексах таблицы «Факт», что, возможно, устраняет мою обеспокоенность по поводу индексов.
«См. Исторические данные» - см. Отдельные строки? Или просто просмотреть сводную информацию? (Опять же, если это похоже на DW, редко приходится видеть старые точки данных.) Если суммирования будет достаточно, тогда большинство из 25TB можно избежать.
У вас есть машина с 25TB онлайн? Если нет, это может заставить вас иметь несколько машин. Но тогда у вас будет сложность выполнения запросов по ним.
5TB оценивается по INT = 4 байта и т. Д.? Если вы используете InnoDB, вам нужно несколько на 2 до 3, чтобы получить фактический след. Кроме того, если вам нужно изменить таблицу в будущем, такое действие, вероятно, должно скопировать таблицу, чтобы удвоить требуемое дисковое пространство. Ваш 25TB становится больше, чем 100TB памяти.
PARTITIONing
имеет очень мало действительных вариантов использования, поэтому я не хочу обсуждать это, пока не узнаю больше.
"Sharding" (разделение по машинам) возможно, что вы подразумеваете под "распределенным". С несколькими таблицами вам нужно много думать о том, как разделить данные, чтобы JOINs
продолжал работать.
5TB огромен. Делайте все возможное, чтобы сжать его. Используйте меньшие типы данных, нормализуйте и т. Д. Но не «чрезмерно нормализуйтесь», вы можете оказаться в ужасном состоянии. (Мы должны видеть запросы!)
Есть много направлений, чтобы взять мульти-TB db. Нам действительно нужна дополнительная информация о ваших таблицах и запросах, прежде чем мы сможем более конкретно.
Учитывая нагрузку на запрос, вы должны изучить разбиение таблиц. Могут быть и другие очень разумные решения. –
Вы имеете в виду только разбиение на одну машину, без распределенного разбиения? – Khan
Для этого требуется узнать больше об использовании. Важно то, сколько соединений в среднем у вас есть и как тяжелые запросы они используют.Если они будут по-прежнему активно использовать данные прошлых лет или нет, если запросы обычно ограничиваются одним конкретным годом, как ожидаются быстрые ответы и т. Д. Кроме того, какая версия MySQL у вас есть и конфигурация сервера/экземпляра - CPU/memory/if used только для mysql и т. д. Может случиться, что в какой-то момент вам понадобится отдельный экземпляр на каждый год и запросите их из основной базы данных подключений с помощью объединенного движка. Но без подробного знания нагрузки трудно сказать ... – JosMac