(注意这种情况并不完全是这样,但我只是举个例子)
我的表中有一个实体,其中的数据每 5 秒更新一次(运动学数据:速度、航向、纬度、经度和位置时间),而其他数据几乎不更新,如果有的话(颜色、品牌、起源时间)。
alt text http://www.freeimagehosting.net/uploads/a67205e99e.jpg
现在我的老板希望我将这些数据分区到数据库中的单独表中(具有一对一关系),如下所示:
alt text http://www.freeimagehosting.net/uploads/1c699bc3c5.jpg
他听起来“显而易见”应该是这样,但是将这些数据分开以便插入和更新(例如,如果我在 Color 或 Make 上放置索引)真的有什么好处吗? p>
最佳答案
像这样进行垂直分区可能是有意义的。或者也可能不会。
当您使用基于 MVCC 的引擎时,每次更新一行时,它通常会*复制整行并通过修改创建一个新行。这样,尚未看到更新的其他事务可以在需要时继续读取原始行。
这意味着在很宽的行中频繁更新一些小列会导致数据库执行比实际需要更多的写入操作。
但不会那么多,因为通常引擎只会同步其事务日志,无论未更新列的大小如何,事务日志的大小都是相同的,而且还因为数据行通常存储在 block 中,其中整个 block 无论如何都需要写,无论改变了多少。
因此,这听起来像是一种潜在的毫无意义的优化,与其他任何优化一样,应该基于以下理由进行考虑: a) 是否确实存在性能问题(即是否需要任何优化)以及 b) 这个特定的优化是解决这个问题的最佳方法吗?
我认为 a) 的可能性不太可能,b) 也不太可能,因此需要这样做的可能性大约是不可能的平方。
* 某些引擎会对非常大的列(例如大 BLOB 或文本列)进行异常(exception)处理,这些列保存在其他位置,并且在行中的其他列更新时不会复制。
关于sql - 表垂直分区的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2082687/