日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
1、什么是分表?
分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件:.myd数据文件,.myi索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。应用读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。
2、什么是分区?
分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。应用读写的时候操作的还是大表名字,数据库自动去组织分区的数据。
3、MySQL分表和分区有什么区别和联系?
1>都能提高mysql的性能,在高并发状态下都有一个良好的表现。
2>分表和分区不矛盾,可以相互配合。对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge分表方式不能和分区配合的话,可以用其他的分表方式试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
3>分表技术是比较麻烦的,需要手动去创建子表,应用服务端读写时需要计算子表名。采用merge方式好一些,但也要创建子表和配置子表间的union关系。
4>表分区相对于分表操作方便,不需要创建子表。
二、分表的方式
1、mysql集群:它并不是分表,但起到了和分表相同的作用。集群可分担数据库的操作次数,将任务分担到多个数据库上。集群可以读写分离,减少读写压力,从而提升数据库性能。
2、自定义规则分表:可以按照业务规则来分解为多个子表。通常为以下几种类型,也可自己定义规则。
1>Range(范围):这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个子表,再通过程序判断逻辑决定该使用哪张子表;
2>Hash(哈希):这种模式允许通过对表的一个或多个列的HashKey进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表;
3>Key(键值):对上面Hash模式的一种延伸,这里的HashKey是MySQL系统产生的;
4>List(预定义列表):这种模式允许系统通过预定义列表的值来对数据进行分割;
5>Composite(复合模式):以上模式组合使用。
3、merge存储引擎分表:merge分表,分为主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。我们可以通过主表插入和查询数据,如果清楚分表规律,也可以直接操作子表。
创建主表时需使用union=(子表1,子表2)与子表进行关联,使用INSERT_METHOD,指明插入方式,取值可以是:0 不允许插入;FIRST 插入到UNION中的第一个表; LAST 插入到UNION中的最后一个表。
在查询主表时,相当于将所有子表合在一起查询。这样并不能体现分表的优势,建议还是查询子表。
三、分区的方式
1、分区定义:
1>range:partition by range(字段名)(partition子句);
2>hash:partition by hash(字段名) partitions ……;
3>key:partition by key(字段名) partitions ……;
4>list:partition by list(字段名)(partition子句);
2、分区管理:
1>新增分区:ALTER TABLE 表名 ADD PARTITION partition子句
2>删除分区:ALTER TABLE 表名 DROP PARTITION 分区名
3>合并分区:ALTER TABLE 表名 REORGANIZE PARTITION 分区名 INTO (partition子句);
参考资料:http://blog.csdn.net/slqgenius/article/details/53001716