在这里,将用户表分成4个分区,以每300万条记录为界限,每个分区都有自己独立的数据、索引文件的存放目录。
还可以将这些分区所在的物理磁盘分开完全独立,可以提高磁盘IO吞吐量。
*List(预定义列表)– 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如:DBA根据用户的类型进行分区。
分成4个区,同样可以将分区设置的独立的磁盘中。
*Key(键值)– 上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
*Hash(哈希)– 这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区,。例如DBA可以建立一个对表主键进行分区的表。
分成4个区,同样可以将分区设置的独立的磁盘中。
= 分区管理 =
删除分区
重建分区
RANGE 分区重建
将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。
LIST 分区重建
将原来的 p0,p1 分区合并起来,放到新的 p0 分区中。
HASH/KEY 分区重建
用 REORGANIZE 方式重建分区的数量变成2,在这里数量只能减少不能增加。想要增加可以用 ADD PARTITION 方法。
新增分区
新增 RANGE 分区
新增 LIST 分区

新增 HASH/KEY 分区
将分区总数扩展到8个。
给已有的表加上分区
分表
分表和分区类似,区别是,分区是把一个逻辑表文件分成几个物理文件后进行存储,而分表则是把原先的一个表分成几个表。进行分表查询时可以通过union或者视图。
分表又分垂直分割和水平分割,其中水平分分割最为常用。水平分割通常是指切分到另外一个或表中。例如对于一个会员表,按对3的模进行分割:
table = id%3
如果id%3 = 0 则将用户数据放入到user_0表中,如id%3=1就放入user_1表中,依次类推。
在这里有个问题,这个uid应该是所有会员按序增长的,可他是怎么得到的呢?使用auto_increment是不行的,这样就用到序列了。
对于一些流量统计系统,其数据量比较大,并且对过往数据的关注度不高,这时按年、月、日进行分表,将每日统计信息放到一个以日期命名的表中;或者按照增量进行分表,如每个表100万数据,超过100万就放入第二个表。还可以按Hash进行分表,但是按日期和取模余数分表最为常见,也容易扩展。
分表后可能会遇到新的问题,那就是查询,分页和统计。通用的方法是在程序中进行处理,辅助视图。
使用分表案例:
案例1:
对会员数据对5取模,放在5个表中,如何查询会员数据:
1.已知id查询会员数据,代码如下:
这样就可以查询某一个会员的数据或者全部会员的数据了。同理,分页的话在这个大集合中使用limit 就可以了。但是这样做又会有一个疑问,把所有的表连起来查询和部分表没有什么区别,其实在实际的应用中,不可能查看所有的会员资料,一次查看20个然后分页。完全没有必要做union,仅查询一个表就可以了,唯一需要考虑的是在分页零界点时的衔接。其实,这个衔接是否那么重要?即使偶尔出现几条数据的差异,也不会对业务有任何的影响。
2.和其它表进行关联和1类似。
3.根据会员姓名搜索用户信息。在这种需求下,需要搜索所有的表,并对结果进行汇总。虽然这样做产生了多次的查询,但并不代表效率低。好的sql语句执行10次也比差的sql语句执行一次快。
案例2:
在一个流量监控系统中,由于网络流量巨大,统计数据很庞大,需要按天分表。先要得到任意日,周,月的数据。
1.需要任意一天的数据。直接查询当天的数据表即可。
2.需要几天的数据。分爱查询这几天的数据,然后进行汇总。
3.需要查询一周的数据。对一周的数据定期汇总到一个week表,从这个表里面查询。这个汇总过程可以由一个外部程序完成,也可以由定期的脚本完成。
4.查询一个月的数据。汇总本月所有的数据到month表,在此表查询。
5.查询5个月内的详细数据。不支持。仅支持最多3个月的详细数据。数据没3个月已归档一次。在大数据的处理中,必须做出一些牺牲。对于超出3个月的数据,仅提供统计数据,详细数据需要查看归档。90天或者180天,给数据保存设个界限,也是大部分这类系统的常规做法,超出90天的数据就不再提供数据详单了。比如,移动的通话记录最多保存半年,即180天,超过这个范围的数据不在提供查询。如果你实在需要,可能就要联系移动的工程师了。
分表前应该尽量按照实际业务来分表,参考依据就是哪些字段在查询中起到作用,那就这些字段来分表,并且需要在分表前就估算好规模,也就是先确定好规则在分表。
对于分表后的操作,依然是联合查询,视图等基本操作,或者使用merge引擎合并数据并在此表中查询。复杂一些操作需要借助存储过程来完成,借助外部工具实现对分表的管理。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-59714-2.html
真爱国绝不是动不动就喊打喊杀
马总