Первая версия моего репозитория для анализа акций выполняла расчёты на OLTP-движке, а вторая запускает ту же нагрузку на OLAP-стеке. Я выбрал OLAP-стек ради одной оптимизации, но чтобы воспользоваться ею, пришлось разобраться во всём lakehouse.
Конструкция InnoDB даёт три гарантии, которые определили мои первые решения. Она хранит все столбцы строки вместе, поэтому получение одного бара для одного тикера обращается к одному месту на диске, что подходит для загрузки данных. Однако индикатору, которому нужны только два столбца, всё равно приходится читать все столбцы через буферный пул. Индексы ускоряют чтение, но замедляют запись, поскольку каждая запись должна обновить каждое B-дерево таблицы. Это отлично для избирательных чтений и ужасно для загрузки с интенсивной записью, поэтому мои таблицы Raw* содержат только первичный ключ.
InnoDB также использует журнал отмен (undo log), который позволяет читать и записывать одновременно. Когда строка обновляется или удаляется, старое значение сохраняется, чтобы другие сеансы могли его прочитать. Вставки создают меньший журнал отмен, который очищается при фиксации. Журналы отмен обновлений и удалений попадают в глобальный список истории, который InnoDB очищает, когда завершаются все сеансы, начатые до фиксации. Этот механизм называется Multi-Version Concurrency Control, или MVCC, и он позволяет выполнять вставки и обновления, не блокируя чтение.
Сам того не осознавая, я спроектировал свою базу InnoDB на основе OLAP-принципа. В таблице financialdata хранились дата и время вместе с ценами OHLC, и каждому техническому индикатору требовался join с ней, чтобы найти дату. Это была одна из моих худших схем данных, и я понял это только тогда, когда база выросла больше чем до 100 ГБ. Исправлять её было очень тяжело.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing