1
huyi23 2018-04-03 12:29:29 +08:00
没有,下一个
|
2
murmur 2018-04-03 12:31:14 +08:00
分表 count 本身就很蛋疼 计数器必须单独存一个字段里 我记得是 innodb 和 myisam 有一个 count 得行扫的 千万级刚得住?
|
3
hcymk2 2018-04-03 12:31:30 +08:00 1
请不要土法上马,找个中间件,或者用 mysql 的 partition
|
4
jy01264313 2018-04-03 12:33:29 +08:00
merge 引擎可以把表逻辑合并在一起
|
5
woodface2233 2018-04-03 12:38:49 +08:00 via iPhone
这在每个公司都算是核心技术了吧
|
6
capric 2018-04-03 12:48:25 +08:00 via Android
二次查找,获取全局视野,修正 offset
|
7
fox0001 2018-04-03 13:09:03 +08:00 via Android 1
其实,有用户会关心 5 千万的总数,或者总页数吗?楼主会不会被自己的设计坑了?
总的来说,还是取巧吧。 1 ) N 年前的数据一般没人关心,可以只把近期的数据取出来做分页。例如近几年的数据。 2 )采用异步任务获取数据。比如界面新建任务,后台用定时任务查询数据,任务结束后通知用户 3 )采用缓存,记录总的数量。如果记录是固定的,甚至每页的数据 ID、标题都可以缓存起来。具体要看某条数据的内容,拿 ID 去查数据库。 4 )确实要五千万实时查询,可以借助其它系统或工具,这就不是一个 MySQL 能简单处理的了。例如 Solr、Hadoop 等 具体还是要看楼主的需求。 |
8
jixiangqd 2018-04-03 13:19:02 +08:00
partition 正解。。。
|
9
realpg 2018-04-03 13:26:16 +08:00
问 dba 去
理想状态,这种库上的触发器都应该一大堆 用来维护各种人工辅助数据 |
10
iyaozhen 2018-04-03 13:34:19 +08:00 1
几亿条内数据用 MySQL 自带的 partition 足够了,注意选好表分区字段,查询的时候必须带上。当然你要直接这样 count 谁也救不了你
|
11
Aluhao OP @fox0001 谢谢,学习了,我也是这样想,把数据按年拆分出来;
article_comments_2005 ~ article_comments_2018 按年拆分,然后根据不同的时间去检索,有人试过没? |
12
ty89 2018-04-03 14:03:31 +08:00
很好奇到底是什么需求,需要把几千万的数据翻页看完
|
13
Aluhao OP @ty89 其实也不是全部需要翻页;
大致需求就是用户信息推送围绕关注,如关注某个人,某个话题,某个文章,某个新闻,这样的逻辑就需要把所有旧的数据聚合起来,然后分页显示; |
14
snail00 2018-04-03 14:28:44 +08:00 1
第一, hash 平均分一下, 统计一个表的数量, 不超过 50w, 再乘表个数就行.
第二, 每个表 50w 条, 整个中间表, 维护这些表的信息, 一个表满了, 换下一个, 方便扩充, 表的信息找中间表查. 第三, 用中间件, 数据库只做精准查询. 第四, 冷热数据分开, N 长时间没人看的数据打包到一个表, 加个自增字段维护. |
15
opengps 2018-04-03 17:03:24 +08:00 1
五千万建议先考虑表分区
|
16
crazyneo 2018-04-03 20:31:41 +08:00 1
首先,单表 5000 万并不需要分表,极端一点的情况就是考虑下表分区。
其次,不要在 5.7 版本以前的 MySQL 中执行 count,无解,带条件尤甚。 5.7 的 InnoDB 提供了 records 接口统计,https://dev.mysql.com/worklog/task/?id=6742 以及官方提及的“ The next worklog, WL#6605, is intended to return the COUNT(*) through this handler::records() interface almost immediately in all conditions just by keeping track if the base committed count along with transaction deltas ” |
17
linyinma 2018-04-04 10:42:54 +08:00
楼主在说什么呢,表太大就想到的是拆表,思路是正确的, 但怎么可能是脱离业务需求,采用平均拆表这种小学生的都能想到的办法呢?
得结合业务,比如日常查询条件频率进行拆分,如果所有的表都属于高频率查询范围,业务上可以采用间接的办法,比如结合 NOSQL 进行查询; 总之一句话 单个再优秀程序也是禁不起不假思索的使用,合理的利用工具也是非常重要的 |
18
Aluhao OP 你们有人用过 TIDB 分布式 NewSQL 数据库么,它的数据结构和语法和 MYSQL 差不多呀。
我一直在看,是不是把数据转到这里会不会好一些,就不用再分表了; |
19
xiebruce 2019-04-29 16:00:50 +08:00
有点好奇边缘数据怎么处理,假如一页 10 条,其中几条在前一个表,有几条在后一个表,怎么处理?哈哈
|