表垂直分区的优点

mai*_*rgs 2 sql database indexing database-design

(请注意,这种情况并不完全是这样,但我以此为例)

我在表中有一个实体,每5秒更新一次数据(运动数据:速度,标题,纬度,长度和位置时间),以及几乎没有更新的其他数据(如果有的话)(Color,Make,OriginTime) .

alt text http://www.freeimagehosting.net/uploads/a67205e99e.jpg

现在我的老板要我将这些数据分成我们数据库中的单独表(具有一对一关系),如下所示:

alt text http://www.freeimagehosting.net/uploads/1c699bc3c5.jpg

他说它应该是这样的"听起来很明显",但是将这些数据分开以便插入和更新真的有什么好处(例如,如果我在Color或Make上放一个索引)?

Mar*_*rkR 5

像这样做垂直分区可能是有意义的.或者它可能不会.

当您使用基于MVCC的引擎时,每次更新行时,它通常*复制整行并创建一个带有修改的新行.这样,如果需要,其他尚未看到更新的事务可以继续读取原始行.

这意味着频繁地在非常宽的行中更新一些小列会导致数据库执行比它需要的更多写入.

但不是很多,因为通常引擎只会同步其事务日志,无论非更新列的大小如何,它都将是相同的大小,并且因为数据行通常存储在整个块需要的块中无论如何,无论多少改变都写了.

因此,它听起来像一个潜在的无意义优化,与其他任何一样,应该考虑以下因素:a)确实存在性能问题(即需要进行任何优化)和b)这种特殊优化是否是修复它的最佳方法?

我认为a)的可能性不太可能,而b)也不太可能,因此需要这种情况的可能性几乎不大.

*某些引擎会对非常大的列(例如大型BLOB或文本列)进行例外处理,这些列位于其他位置,如果更新了行中的其他列,则不会复制.