Mysql 分表的问题,求教

2015 年 9 月 17 日
 cjyang1128

在我的 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.网上看了很多关于分表和分区的介绍,感觉还是云里雾里。对于我这样的业务情况,需要采用的是分表还是分区。它们的区别是什么呢?

望各位大神指点~

3140 次点击
所在节点    程序员
16 条回复
cjyang1128
2015 年 9 月 17 日
求解~
kslr
2015 年 9 月 17 日
对你字段的分析应该都是 Int 吧,除了 create_time 这样的,千万还没达到需要分表的地步,分表后也很麻烦,还是优化吧。

对了, mysql5.6 性能提升很多,严重推荐
cjyang1128
2015 年 9 月 17 日
@kslr 是这样的,因为这张表迟早是要分的,所以才会要求分表,然而我也没有这方面的经验。 mysql5.6 我可以看一下,谢谢回答~
kslr
2015 年 9 月 17 日
@cjyang1128 话说像用户操作这些为什么不把几个月前的扔掉?没做过这块问问
kingwkb
2015 年 9 月 17 日
千万级不需要分表,为什么迟早要分表
cjyang1128
2015 年 9 月 17 日
@kingwkb 因为是用户操作,所以增长的速度很快
@kslr 目前来说还是需要所有的操作记录的
9hills
2015 年 9 月 17 日
按照 enterprise_id 分表,但是不同企业的数据量可能差别特别大,导致你分的表会变的不均匀

分表不仅要考虑查询效率,也要考虑数据均匀啊
kslr
2015 年 9 月 17 日
@cjyang1128 我觉得更适合按照月分表,到时候直接按照时间找数据就行了。
9hills
2015 年 9 月 17 日
一般来说是按照 user_id 取模的方式来分,这样大体上保证数据比较均匀。

当然弱点就是你查询范围是单个企业时,要遍历所有的表。
cjyang1128
2015 年 9 月 17 日
@9hills 这是个问题,我们讨论了之后决定先暂时不管这个。其实我们只是先试行分表的方法,先去踩坑。
cjyang1128
2015 年 9 月 17 日
@kslr 这个我们也考虑一下,谢谢~
sunmonster
2015 年 9 月 17 日
为什么不用 nosql 呢,比如 mongodb ,一个企业,一个 collection ,对每个 collection 设置为固定 collection ,不过我自己也没有用过
cjyang1128
2015 年 9 月 17 日
@sunmonster 还是先用 mysql ,实在不行再去考虑其他的 nosql 数据库
hymanhai
2015 年 9 月 17 日
千万级不需要分表,对于 mysql 对几 KW 的数据的支持都是很 easy 的,而且看的你表示设计的也不复杂,关键是看你对数据库怎么使用。
最最要的是你这是存储用户信息的,你觉得你们公司的用户增长有多快??
Mac
2015 年 9 月 17 日
近 3 月一个表,其他一个表
akira
2015 年 9 月 17 日
按日期建表,每天丢给做数据分析的人

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/221380

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX