分区和分表
1、为什么要分表和分区
日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
2、什么是分表和分区
2.1、分表
分表,从字面上理解,就是把原本在一张表中的数据,分开到多张实体表中。基于这样的理解,其实现方式常见有两种:垂直切分、水平分表。
它是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
2.1.1、垂直分表
垂直分表,是指对原始表的列进行拆分,根据一定的拆分规则,把一张表的列,拆分成多张表。如:把原始表中不常用的列拆分到一张表,把一些存储大数据量的字符拆分到一张表,把经常一起使用的列拆分到一张表,......等等。
这样拆分的多张表,每张表都可以有自己的存储引擎、索引等,使用灵活,性能也可以得到提升。按照这样的理解,大家见的比较多的‘视图’也是一种分表。
但是,注意,垂直分表,只是拆分了原始表的列,没有减少表的行,原来是多少行,还是多少行。在企业中,对表垂直拆分一般都是开发人员或架构师,对业务比较熟悉的人执行。
2.1.2、水平分表
水平分表,最容易理解的是指对原始表的行进行拆分,根据一定的拆分规则,把原先存在一张表的数据,分表存储到多张表中。如:根据 id 取模,hash 值、按日期月份...等等。
这样,原本存储在一张表中数据,被分开存储在不同的表中,大大降低了单表的数据量。
2.2、分区
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。 分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
3、选择分区还是分表
在做出分区或分表的判断上,一般来说,如果平时访问的量不是特别大,表结构变更也不多,而且历史数据很少访问的情况下,可能会做成分区表,这样平时基本上只要访问最近的分区段,还有利用老数据的清理。分表一般是数据量非常大,而且访问上没有绝对的热点,基本上所有的数据都有可能会访问到,为了查询的性能和平时DDL的快速会采用分表的方法。
我们这次的分区是是按创建时间来分区的 ,两张表是半年一个分区.那么在查询的SQL中是要求带入创建时间作为where条件的,这样的话可以调高效率。