HeadlinesBriefing HeadlinesBriefing.com

InnoDB 与 Iceberg:OLTP 与 OLAP 内部机制对比

Hacker News •
×

我的股票分析项目第一版在 OLTP 引擎上运行分析,第二版则在 OLAP 技术栈上运行相同的工作负载。我选择 OLAP 技术栈是为了一项优化,但要充分利用它,就必须理解整个湖仓架构。

InnoDB 的设计包含三项保证,塑造了我早期的选择。它将一行的所有列存放在一起,因此为某个股票代码获取一根K线只需访问磁盘上的一个位置,这适合数据摄取。然而,一个只需要两列的指标仍然会通过缓冲池读取所有列。索引加快了读取速度,却会拖慢写入,因为每次写入都必须更新表中的每一棵 B 树。这对于选择性读取很有利,但对于写入密集型的数据摄取却非常糟糕,这也是我的 Raw* 表只有主键的原因。

InnoDB 还使用撤销日志,从而支持并发读写。当一行被更新或删除时,旧值会被保存下来,以便其他会话仍能读取。插入操作会生成较小的撤销日志,并在提交时被清除。更新和删除的撤销日志会加入一个全局历史列表,InnoDB 会在所有在该提交之前开始的会话结束后再将其清除。这一机制即多版本并发控制(MVCC),它使插入和更新无需阻塞读取即可进行。

我当时并未意识到,我设计的 InnoDB 数据库采用了 OLAP 的基本思路。我的 financialdata 表同时保存日期时间和 OHLC 价格,而每个技术指标都需要与该表连接以查找日期。这是我最糟糕的数据设计之一,直到数据库中的数据超过 100GB 时我才意识到问题。修复它非常艰难。

来源: Hacker News · 由HeadlinesBriefing整理摘要