前言
垂直分表是分库分表中分表操作上一个重要的实现方式,利用垂直分表可以提高数据的处理效率和查询速度,本节主要围绕 垂直分表为什么能够加快查询速度 展开说明,以mysql查询的底层流程为例。
垂直分表是将一张表按列分为多张表,每张表的结构都不相同,多张表通过主键进行关联,从而组成完整的数据。垂直分表可以将热点数据(经常查询、更新频繁的列)分离出来,放在独立的表中
原因(表层)
这里先从表层说一下,垂直分表为什么可以加快操作和查询效率:
- 查询性能提高:垂直分表可以将热点数据(经常查询、更新频繁的列)分离出来,放在独立的表中,这样查询这些数据时就不需要查询整个表,只需要查询较小的数据集,从而提高了查询性能。
- 数据冗余度提高:垂直分表中的数据是按照列进行分离的,这样可以提高数据的冗余度,即重复存储一些数据,以备不时之需。这样即使某个列的数据发生更改,也只需要更新相应的表,不会影响其他表的数据,从而提高了数据的安全性。
- 并发处理能力提高:垂直分表可以将不同的列存储在不同的表或数据库中,这样可以并行处理不同的表或数据库,提高了并发处理能力。
原因(底层)
- 减少I/O操作:MySQL在执行查询时,需要读取表中的数据,而读取磁盘上的数据是需要消耗一定的I/O操作。如果一个表的数据量很大,那么读取整个表的数据就需要花费很长的时间。垂直分表将表按照列进行拆分,将不同的列存储在不同的表中,这样在查询时只需要读取需要的列,从而减少了I/O操作,提高了查询效率。
- 减少锁的开销:在并发处理时,需要对表进行加锁以保护数据的一致性。如果一个表的数据量很大,那么在对这个表进行加锁时就会花费很长的时间,并且也会占用很多的内存。垂直分表将不同的列存储在不同的表中,可以并行处理不同的表,从而减少了锁的开销,提高了并发处理能力。
- 索引的使用:垂直分表将不同的列存储在不同的表中,可以根据列的重要性和使用频率建立相应的索引。对于经常查询的列,可以建立更精细的索引,而对于不经常查询的列,则不需要建立索引。这样可以使索引的使用更加合理,从而提高查询效率。
- 数据量的减少:垂直分表将一张表按照列进行拆分,将不同的列存储在不同的表中,这样每个表的数据量就会减少很多。如果一个表的数据量很大,那么在对这个表进行查询时就会花费很长的时间。而垂直分表将数据分散到多个表中,每个表的数据量减少了很多,从而减少了查询时间。
以下例子按照索引形式说明
数据库表中的数据以页为单位存储在服务器的磁盘中,若不进行垂直分表,在数据量很大的情况下,一页可以存储的行数很少(因为有很多列),每次查询时,按照页将一整页数据加载进内存(一次IO一页),若一页中存储的行数很少,则可能会进行多次IO才能找到目标所在行;而进行垂直分表之后,将热点列单独取出,放到了一张新表中,此时,因为列减少了,每页存储的行数就增加了,所需能找到目标所在行的IO操作次数就减少了。因此,垂直分表可以使数据库的查询操作变快。