« 上一篇下一篇 »

大字段垂直分拆——Summary表优化

大字段垂直拆分策略相对于适度冗余策略在做法上可以说是完全相反的。适度冗余策略是将别的表中的字段拿过来在自己身上也存一份,而大字段垂直拆分简单来说就是将自己身上的字段拆分出去放在另外的表里。什么样的字段适合从表中拆分出去呢?

    首先,肯定得是大字段。为什么?原因很简单,就是因为它大。大字段一般都是存放着一些较长的detail信息,如文章的内容、帖子的内容、产品的介绍等。

    其次是和表中其他字段相比访问频率明显要少很多的。由于大字段存放的内容较多,大部分情况都占整条记录的80%以上,而数据库中数据在数据文件中的格式一般都是以单条记录为单位来存放的。也就是说,如果要查询某些记录的某几个字段,数据库并不是只需访问要查询的那几个字段,而是需要读取其他所有字段(可以在索引中完成整个查询的情况除外)。这样,就不得不读取包括大字段在内的很多并不相干的数据。而由于大字段所占的空间比例非常大,自然所浪费的IO资源也就相当大了。

    在这样的场景下,需要将该大字段从原表中拆分出来,通过单独的表进行存放,让我们在访问其他数据时大大降低IO访问,从而使性能得到较大的改善。

    可能有人会疑惑,虽然移出之后访问其他字段的效率提高了,但是当需要大字段的信息时,就无法避免的需要通过Join来实现,而使用Join之后的处理效率可能会大打折扣。其实这样的担心是很合理的,这也就是在分拆出大字段之前还需考虑的第二个因素——访问频率。决定一个字段是否要分拆出去,除了“大”之外,还要“频率低”才行,当然,这里的“频率低”只是“相对频率”而已。而且,分拆之后的两个表是完全确定的一一对应关系,使用Join在性能方面的影响也并不是特别大。

    那在移出大字段的同时,是否还须将其他字段也一并移出呢?其实如果已经确定有大字段需要分拆出主表,对于其他字段,只要和大字段一样满足访问频率相对于表中其他字段低很多的,都可以和大字段同时分拆出来。

    实际上,有些特别的场景中,甚至都不一定非得是大字段才能进行垂直分拆。在这种场景下,有的表中大部分字段平时都很少访问,而其中的某几个字段访问频率却非常高。对于这种表,也非常适合通过垂直分拆来达到优化性能的目的。

« 上一篇下一篇 »