Как подготовить MySQL 8.0 с датасетом из 5 млн. фото (2 ТБ) и текстово-числовой информации (50 ГБ) для максимальной производительности на чтение?
Нужно добиться максимальной производительности.
Как я понимаю, исходить нужно из того, что БД будет работать только на чтение. Запись в БД не предвидится!
Какой движок лучше выбрать: InnoDB, MyISAM или ещё какой-то?
Стоит ли удалить все уникальные индексы, или может быть заменить их обычными индексами?
Стоит ли удалить все внешние ключи? Ведь запись не предвидится и нарушение целостности данных не произойдет.
Может что-то ещё?
Что уже сделал:
1) Удалил из БД всю инфу, не участвующую в обучении.
2) Во всех текстовых полях всех таблиц изменил кодировку (CHARACTER SET) с utf8mb4 на cp1251. Оказалось, что все хранимые символы в БД умещаются в пространство cp1251.
3) Для всех целочисленных полей установил минимально достаточный целочисленный тип данных.
4) Все таблицы (кроме таблицы с бинарными данными фото) сделал static: все записи каждой таблицы имеют одинаковый размер в байтах. Для этого пришлось везде изменить тип VARCHAR на CHAR (а кодировка cp1251 в свою очередь гарантирует, что поле типа CHAR для всех записей имеет одинаковый размер в байтах). Благо из-за этого съелось
совсем немного дополнительного места на SSD.
5) Заменил, где это возможно, внешние ключи на ENUM. Насколько это целесообразно для порядка 50 000 значений в ENUM?
Для обучения нейросети mysql совершенно не подходит, абсолютно бесполезно и создаст дополнительные накладные расходы.
Храните все в файлах, практически все библиотеки работы с нейронными сетями предоставляют свои форматы для хранения обучающей выборки, используйте их в т.ч. Понятно не удаляйте оригинальные изображения.
На входы/выходы нейронной сети подаются числа,.. в некоторых библиотеках есть готовые инструменты по работе с битмапом, но это просто методы, приводящие изображение к нормализованному массиву чисел
Вам может понадобиться хранить сами нейронные сети (в процессе обучения их может быть много) и значения функций ошибки для обучающих данных для каждой сети, в данном случае наверное можно было бы организовать такое хранение в базе, но не изображения, а ссылки на них.
Иван Мельников, я пытаюсь намекнуть, что при обучении вы можете упереться не в базу, а в CPU/GPU. Оптимизировать нужно то, что является бутылочным горлышком всего процесса. С какой скоростью ваш CPU/GPU кластер способен обрабатывать данные из этой базы?
Я понимаю, что обучение упрется скорее всего в GPU. Но меня сейчас интересует оптимизация только БД, находящейся на SSD. Можно считать, что это чисто теоретический интерес.
может быть постановка вопроса в корне неверная? если бд как статика, есть ли от нее профит? рассматривали ли другие бд, которые заточены именно под подобного рода кейсы? если выборок не предвидится, может рассмотреть какие-то бд аля ключ значение , скорость и нагрузку можно достаточно быстро протестировать же