视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
分库分表的排序
2020-11-09 16:06:14 责编:小采
文档

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

分库分表的排序

分库分表的排序

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到应用端,然后在程序端很容易做汇总,排序分页操作

------end----

下载本文
显示全文
专题