myslq分表分库方案,请大家指正,多谢先!

csdncb 2012-05-10 11:00:56
加精
项目背景:
最近写了一个小程序,对订单数据处理,写入/读取次次差不多,近2月约为30W条数据(mysql存储),且在近一步快速增长中。心里很是紧张,如果超过100W了会如何?

解决问题:数据记录多时读取速度。

在网上搜索了Mysql的分表分库方案,主要有mysql proxy,Amoeba,HiveDB等。大概比较了一番,好象都不能完全达到我的理想要求:
R1.数据库、数据表可以无限增加
R2.增加时进无需要迁移数据,或者简略简单。
R3.可以人工分配
R4.解决日期分段提历史数据查询问题,并可与主库分离(一个业务库对一个历史库2-3年数据,更早期数据归档,用户不能查询)
R5.解决主从数据库的访问,或者单点故障。

可配置,尽量不修改现在的程序。

解决办法:
为每人用户分配一个数据分区标志,终身不变以此定位数据。如user1(分区标志3)则交易数据存存在tblxx_3,历史数据存储在tblxx_3_yyyymm中,tbl_xx是开发测试时使用,也是一个真实的分表。
配置文件定义:
1. tblxx 可被替换
2. 分区标志3的数据库位置信息{3,},实际如下(php代码)
$shard['dbservers']=array(
'master'=>array(
array('1,3,70','localhost', 'eprinter', 'root', 'root', 'mysql'),
array('2,4,50','localhost', 'eprinter2', 'root', 'root', 'mysql')
),
'slave'=>array(
array('1,3,5','localhost', 'eprinter', 'root', 'root', 'mysql'),
array('2,4,50','localhost', 'eprinter2', 'root', 'root', 'mysql')
),
'history'=>array(
array('1,3,5','localhost', 'eprinter', 'root', 'root', 'mysql'),
array('2,4,50','localhost', 'eprinter2', 'root', 'root', 'mysql')
)
);


3.程序调整地方:
(1)设置用户分区代码(session启动时{user.分区码}写到数据访问类db中)
(2)拦截SQL,执行简单的SQL替换,将tblxx,替换成tblxx_分区码
(3)根据分区码,选择数据库.(这一步目前未实现,我分了10表,感觉已经够多的了,50W*10,也够我用好长时间了。)

完了!!!

附记:方案想了很久,代码花了半天时间,实际运行了几天,感觉良好。

潜在问题:可能遇到到数据库IO瓶颈(实现3.(1)后可消除),WEB服务单点故障。

结论:也算是一个可管理的分库分表方案,或者数据库透明代理了。

请大家指出不足的地方,以改进。请大家指出不足的地方,以改进。多谢,多谢,多谢!!!




...全文
6585 96 打赏 收藏 转发到动态 举报
写回复
用AI写文章
96 条回复
切换为时间正序
请发表友善的回复…
发表回复
qilangye 2014-05-16
  • 打赏
  • 举报
回复
引用 75 楼 cpio 的回复:
我们搞过上亿数据在一个表,仍然很快呀,每秒几百条新记录插入。
能否交流一下?qq563514106
  • 打赏
  • 举报
回复
关注中。我也遇到了。不过楼主说的方法不是很好吧。
mayanyun1986 2012-11-28
  • 打赏
  • 举报
回复
这也忒简单了
diffmaker 2012-05-26
  • 打赏
  • 举报
回复
我是路过学习的~~~~

问一下,分表之后,我想查一下三个月内订单总额的前10位用户,如何?
csdncb 2012-05-21
  • 打赏
  • 举报
回复
给分以后,还可以继续讨论啊?希望大家分享自己实际经验,经后来以帮助和信心。
silly11 2012-05-18
  • 打赏
  • 举报
回复
赞一个
qdkfriend 2012-05-17
  • 打赏
  • 举报
回复
收藏一下
sunjinli8 2012-05-17
  • 打赏
  • 举报
回复
非常不錯。。。。。學習了
csdncb 2012-05-16
  • 打赏
  • 举报
回复
等待亲出这个方案缺点。
下面两个相关的讨论,喜欢的朋友可以阅读:

现在公司要做一个数据库方案,总体目标是要存约 200T 的数据,机器不是问题。
http://topic.csdn.net/u/20100317/12/fecc83b6-4849-48cf-a20b-24d552fd1cd0_2.html

如何构建千万用户级别后台数据库架构设计的思路
http://www.mysqlops.com/2011/11/22/database-arc.html
  • 打赏
  • 举报
回复
mysql 5000w数据是没有问题的 不用担心
txzsp 2012-05-16
  • 打赏
  • 举报
回复
可以考虑多分点表,加点索引,没事的。
DolphinOrca 2012-05-16
  • 打赏
  • 举报
回复
推荐楼主看一篇文章
里面有如何分表的方法。

淘宝下单高并发解决方案
http://www.cnblogs.com/yukaizhao/archive/2012/04/23/taobao_order_design.html
懒得去死 2012-05-15
  • 打赏
  • 举报
回复
分真多。
csdncb 2012-05-15
  • 打赏
  • 举报
回复
to cpio 能否分享你的的方案,都说mysql处理100W的记录就到瓶颈了。你的查询速度如何?
wangchunlly 2012-05-15
  • 打赏
  • 举报
回复
非常不錯。。。。。學習了!
cpio 2012-05-14
  • 打赏
  • 举报
回复
我们搞过上亿数据在一个表,仍然很快呀,每秒几百条新记录插入。
sglogin 2012-05-14
  • 打赏
  • 举报
回复
如果有“交并集”或汇总操作怎么处理呢
sglogin 2012-05-14
  • 打赏
  • 举报
回复
建议先压力测试看看能不能满足需要
taoqiguijungege 2012-05-13
  • 打赏
  • 举报
回复
能完全满足楼主的要求,有点难实现
小昌 2012-05-13
  • 打赏
  • 举报
回复
接触MySQL proxy,做起几万条数据的操作感觉很好,推荐用代理,或许本人对代理情有独钟。
加载更多回复(25)

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧