Mysql 千万级数据在后台管理的展示问题

2019-04-16 10:08:19 +08:00
 Boywus

现在有一张钱包明细表,项目运行了两个月,已经达到了一千万的级别了,现在碰到了一个问题:

后台管理要求显示:

  1. 这个表的总条数
  2. 对这个表进行分页, 然后要显示总页数

第二个要求应该是基于第一个要求的,所以就是取决于

select count(*) from wallet_trans_detail where ...

这个 count 操作现在耗时还能接受,但是已经有点慢了,如果再运行两个月,分页的加载将会特别慢。

而且最近有分表计划,按照 user_id 取模进行分表放进不同的钱包明细表。

这样子有好几个表的内容使得总览的时候分页处理更加麻烦了。

各位大哥有什么好方法?

8055 次点击
所在节点    MySQL
36 条回复
kimchan
2019-04-16 11:46:43 +08:00
@lihongjie0209 #9 因为我看原文中就说了带 where 😂😂. 以为你说的这个方案是已经考虑了这块
love
2019-04-16 11:48:21 +08:00
@Boywus 谁说翻到最后一页要用 offset,直接按照日期倒叙排序就行,有索引在没性能问题
tedcon
2019-04-16 12:06:41 +08:00
翻最后一页面 完全可以 oder by id asc, 针对常用场景优化是一个基本操作吧。
翻页操作用 where id > lastId limit pageSize 来做, 常规优化
reus
2019-04-16 14:09:55 +08:00
加个开关,想要显示时才计数,没必要为了不常用的操作,拖慢所有操作

也就是默认只有前后翻页,计算总条数当作独立的功能
vance
2019-04-16 15:46:26 +08:00
explain select XXX 有个 rows 字段,显示的是大致的总数
lcy630409
2019-04-16 16:17:09 +08:00
如果只有你说的哪两个需求 你可以直接获取最后一条数据的 id 除以分页数
如果你的数据可能删除,哪就做定时缓存,每 3/6/12/24 小时 获取一次总条数,缓存在另外的表的字段里
lcy630409
2019-04-16 16:18:19 +08:00
带有 where 的话,目前做好索引,用空间换速度,千万条数据 也很快的,前台基本感觉不出来,如果很慢的话 估计就是你的索引没做好
Boywus
2019-04-16 18:32:31 +08:00
@vance 那个似乎不支持 where 查询吧
Boywus
2019-04-16 18:39:39 +08:00
@lcy630409 where 获取数据很快,where 情况下的 count 也能接受。

由于历史原因,id 数有过断层,这个方案行不通。

需求就是在总览的时候要求能够显示总条数,现在已经条数异步了,只能给上下页,然后查看指定用户的时候再提供分页。
kltt22
2019-04-16 19:13:49 +08:00
存个修正参数就可以用 ID 数了
zhihhh
2019-04-16 20:52:25 +08:00
为啥才 1000w 就要分表了 - - 第二个分页的需求没看懂。如果一定要精确的 count 不大的情况下直接 count(*) 如果量大维护一个索引值 可以放 redis 也可以搞个表存。不需要精确的 可以使用执行计算的 rows。
qianlifeng
2019-04-16 21:40:10 +08:00
influxdb
vjnjc
2019-04-17 09:24:19 +08:00
有了动态 where 后,你们还怎么把 count 缓存下来啊?
建议常用的 where 组合建索引
jaky666
2019-04-17 11:09:59 +08:00
elassearch
shangfabao
2019-04-17 13:50:01 +08:00
才 1000 万,索引就能解决了吧
cs8814336
2019-04-18 16:57:29 +08:00
分页有 2 种,1 种是扶梯式, select * from xxx where id>xxx
2.第二种就是你这种精确分页了. select * from xxx limit xx,n

通常第二种大数量的时候性能会很差,带上分表可能会更复杂. 一般做法是对于 select * from xxx where xxx limit xxx,n
的查询, 进行多个分表同时查询 select * from xxx where xxx limit xxx,n, 对 m 个表查出来的最多 n*m 个数据进行人工排序,取前 n 个.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/555591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX