在我的 Mysql 5.5 中,现在有一张表 user_activity 专门用来存储用户的操作行为。表结构大致是这样的, id (自增主键), user_id , enterprise_id , action_type_id , created_time 。现在由于该表的数据量已经变得很大了(已经快达到千万行),需要进行分表。因为我们经常是查询某个企业下的用户操作行为,所以按照 enterprise_id 进行分表是一个方法。问题如下:
1.如果要进行分表,那么一开始分表的 SQL 要怎么写比较好,然后因为我们采用的是 INNODB 引擎,用不了 merge 类型的分表。
2.如果要进行分表,对于我现在的业务情况,对 enterprise_id 采用怎样的 sharding 算法会比较好。
3.网上看了很多关于分表和分区的介绍,感觉还是云里雾里。对于我这样的业务情况,需要采用的是分表还是分区。它们的区别是什么呢?
望各位大神指点~
1
cjyang1128 OP 求解~
|
2
kslr 2015-09-17 13:40:13 +08:00
对你字段的分析应该都是 Int 吧,除了 create_time 这样的,千万还没达到需要分表的地步,分表后也很麻烦,还是优化吧。
对了, mysql5.6 性能提升很多,严重推荐 |
3
cjyang1128 OP @kslr 是这样的,因为这张表迟早是要分的,所以才会要求分表,然而我也没有这方面的经验。 mysql5.6 我可以看一下,谢谢回答~
|
4
kslr 2015-09-17 14:11:38 +08:00
@cjyang1128 话说像用户操作这些为什么不把几个月前的扔掉?没做过这块问问
|
5
kingwkb 2015-09-17 14:13:14 +08:00 via iPhone
千万级不需要分表,为什么迟早要分表
|
6
cjyang1128 OP |
7
9hills 2015-09-17 14:23:50 +08:00
按照 enterprise_id 分表,但是不同企业的数据量可能差别特别大,导致你分的表会变的不均匀
分表不仅要考虑查询效率,也要考虑数据均匀啊 |
8
kslr 2015-09-17 14:27:39 +08:00
@cjyang1128 我觉得更适合按照月分表,到时候直接按照时间找数据就行了。
|
9
9hills 2015-09-17 14:31:13 +08:00
一般来说是按照 user_id 取模的方式来分,这样大体上保证数据比较均匀。
当然弱点就是你查询范围是单个企业时,要遍历所有的表。 |
10
cjyang1128 OP @9hills 这是个问题,我们讨论了之后决定先暂时不管这个。其实我们只是先试行分表的方法,先去踩坑。
|
11
cjyang1128 OP @kslr 这个我们也考虑一下,谢谢~
|
12
sunmonster 2015-09-17 14:42:53 +08:00
为什么不用 nosql 呢,比如 mongodb ,一个企业,一个 collection ,对每个 collection 设置为固定 collection ,不过我自己也没有用过
|
13
cjyang1128 OP @sunmonster 还是先用 mysql ,实在不行再去考虑其他的 nosql 数据库
|
14
hymanhai 2015-09-17 18:04:23 +08:00
千万级不需要分表,对于 mysql 对几 KW 的数据的支持都是很 easy 的,而且看的你表示设计的也不复杂,关键是看你对数据库怎么使用。
最最要的是你这是存储用户信息的,你觉得你们公司的用户增长有多快?? |
15
Mac 2015-09-17 18:11:53 +08:00 via iPhone
近 3 月一个表,其他一个表
|
16
akira 2015-09-17 21:55:28 +08:00
按日期建表,每天丢给做数据分析的人
|