mysql之分表

分表是一种设计方法。而不是数据库本身所提供的功能。

在大型数据量的环境下,经常会看到这样的命名:

xxx_001
xxx_002
xxx_003

------------------------------------------------------------

产生背景:

当一张的数据达到几百万时,查询一次所花的时间会变多。尤其是范围查询。
如果有联合查询的话,可能会死在那儿了。
分表的目地就在于此,缩小查询范围,减少时间,减轻数据库的负担。


实例分析
MySQL如何将数据高效分表?

有一个大数据表(数据量上千万),现在想做分表处理,
现在设计的做法是使用php程序,根据每列数据的主键user_id值计算出00-63的64个hash值,散列到64个表中,
请问在将数据导至新的分表时,除了将每一条数据计算出hash值,再插入到新表的方法外,有没有更高效的方法?


-
类似的事情做过一次,当时数据会更多一点,有几亿,按userid 取模100分表的,大概过程是这样的:
1、我可以很容易获得我的useid的最大最小值:min_userid,max_userid。这样粗略认为总表的的userid范围为userlist = [min_userid...max_userid]
2、随便用个脚本把userlist处理(mod或者hash)为100个分组:arr0 ... arr99
arr0为[0,10,20,30 ...]
3、根据 2 的结果拼接100个sql语句.
insert into tb_user_0 (select * from tb_user_all where userid in(arr0));
insert into tb_user_1 (select * from tb_user_all where userid in(arr1));
...
insert into tb_user_99 (select * from tb_user_all where userid in(arr99));
4、批量执行。当时几亿不到20分钟就都搞定了。要比逐条数据处理快很多。
注:userid是有索引的。

-------


================================================================================
怎么样实现MYSQL数据库分表?


假设一个论坛帖子按板块分为N个表

thread_bbs1
thread_bbs2
thread_bbs3
....
thread_bbsN

那一个用户发布的帖子就会散落在N个表里,如果有个业务需要查看用户的所有帖子总数并按时间排序用户的所有发帖,就要join所有的表?

应该怎么样合理的分表呢?

-
Han Du
这个问题不在于如何分表和查询,而在于如何做 数据冗余。

你需要将用户发帖的基本信息用另一些表来存储,比如叫做 thread_user*,这些表按照用户 id 分表,内容包括用户 id、帖子 id、发帖时间等你需要的信息。

每次创建帖子的时候需要同时写两份,thread_bbs* 和 thread_user*,读的时候按需读取对应的表就可以。
-
按照用户的唯一ID去路由分表。
-
分表只是为了分散存储压力,查询的话可以借鉴@Han Du 的方法,建个索引表,存储基本信息。通过索引表去统计和排列,需要具体数据的时候再join。
很多开源的系统,尤其是国外的优秀商城产品,看下数据库设计会发现他们很擅长使用索引表
-
















-




MySQL如何将数据高效分表?
http://www.houziquan.com/question/94

怎么样实现MYSQL数据库分表?
https://segmentfault.com/q/1010000000583058

mysql 分库分表的方法(总结的,概括的)
http://www.cnblogs.com/joe-blog/p/5477380.html













-



猜你喜欢

转载自lixh1986.iteye.com/blog/2357529
今日推荐