分库分表的排序_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2375 | 回复: 0   主题: 分库分表的排序        下一篇 
Gavin
注册用户
等级:少校
经验:878
发帖:130
精华:1
注册:2011-7-21
状态:离线
发送短消息息给Gavin 加好友    发送短消息息给Gavin 发消息
发表于: IP:您无权察看 2015-5-19 14:36:58 | [全部帖] [楼主帖] 楼主

分库分表的排序

1. 对于单库,冗余一个汇总所有数据表,用于全部数据的排序,但是当数据量大,汇总表将会成为瓶颈。这不是一个很好的方案
2. 无论单库还是多个分库,都由程序读取需要数据并作排序。

   排序的几种方式:
    大都是按时间排序的,如果在客户端可以直接判断在哪个分表最好,可以直接读取指定分表并作排序

     例如:
    汇总表td_test_all;而分表是按companyid分表的

       原始sql:

 SELECT * FROM td_test_all
WHERE  companyid =  15997
order by productid desc limit 0,20


   程序端完全可以通过companyid判断在哪个分表读取数据,改为

SELECT * FROM td_test7
WHERE  companyid =  15997
order by productid desc limit 0,20


 这样数据的排序还是通过数据实现的。

如果where条件里没有分区字段的话,如何定位到具体分区呢?可以在设计阶段,在常用字段上埋下分区规则的种子, 比如在td_test7.groupid字段设计由int+7(7表示在分表td_test7里)

如果数据必须从多个分表取数据的话:

对于取top N条记录的话场景


  程序分表读取每个分表的前N条记录(理想的认为数据都来源一个分表,从而减小结果集),如分区td_test0所示:

 SELECT *
FROM td_test0
WHERE createtime> STR_TO_DATE('2013-04-28 15:34:02','%Y-%m-%d %H:%i:%s')
ORDER BY createtime DESC
LIMIT 0,5


   然后程序读取这些结果集,在应用端汇总排序取top N记录

 对于需要分页的话场景


   这个就只能把每个分表、满足条件的的所有记录都load到应用端,然后在程序端很容易做汇总,排序分页操作

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论