首页 注册 登录
V2EX = way to explore V2EX 是一个关于分享和探索的地方
现在注册 已注册用户请 登录
V2EX MySQL

MySQL 大表排序有什么好的方案?只能上 Mongo?

CooperB · 2025 年 6 月 28 日 · 4612 次点击
这是一个创建于 196 天前的主题,其中的信息可能已经有所发展或是发生改变。

大家对大表的排序是怎么优化的?目前业务上没法优化,只能查全量数据且需要根据多个字段排序,是不是只能通过 Mongodb 了?

19 条回复 2025年07月01日 14:19:36 +08:00
nomagick
1
nomagick 2025 年 6 月 28 日
MongoDB 也不是魔法啊大家都是建索引,只能是你在数据结构上做一些优化单独加一个排序字段
CooperB
2
CooperB
OP
2025 年 6 月 28 日
@nomagick 加一个排序字段?每次插入数据的时候都要计算序号?
nomagick
3
nomagick 2025 年 6 月 28 日
@CooperB 按值排序啊,你直接定期把索引项计算出来存着
dzdh
4
dzdh 2025 年 6 月 28 日
不得不再推一波 manticosearch 、openobserve.ai 、PostgreSQL
CooperB
5
CooperB
OP
2025 年 6 月 28 日
@nomagick 定期索引?那不是有延时?
irisdev
6
irisdev 2025 年 6 月 28 日 via Android
数量级是多少?
nomagick
7
nomagick 2025 年 6 月 28 日
@CooperB 要不然怎办,就是把数据库的实时计算转成异步,拿到应用节点来算,你可以每次改数据的时候维护一下这个排序字段,查询的时候直接从索引出尽量少占用数据库的 CPU
evan1
8
evan1
PRO
2025 年 6 月 28 日
能不能把多个字段拼成一个字段然后进行排序。如果可以的话新增一个排序字段,保存聚合后的数据,插入时给默认值。历史数据另行处理。
june4
9
june4 2025 年 6 月 28 日
真有几组组合就不能建多个组合索引?底层数据算法大家都一样的换个数据库有什么用,搞得象别人就有独占魔法一样
copuzzle
10
copuzzle 2025 年 6 月 28 日
这其实是一个业务问题,用技术的手段来解决也只会是短暂的。
一次多筛选条件的实时查询,使用者的角度看,他能关注的数据和数量范围是有限的。
所以一般数据密集场景,要么用时间等限制过滤数据的总量,要么牺牲实时性引入外部组件等等。
回到这个问题的一些可能的解决方案:
1. 二/多次过滤:设定几个索引排序优化最明显的主键,这些作为一次过滤/排序的结果,再用这个结果做二次排序
2. 根据数据量,引入统计分析能力好的中间件,像 @dzdh 讲的这些
realpg
11
realpg
PRO
2025 年 6 月 28 日
什么算法也不能违背物理学...
DonaldY
12
DonaldY 2025 年 6 月 28 日
可以使用下 ADB 。
lifeHasOnce
13
lifeHasOnce 2025 年 6 月 28 日
多大,1kw 的数据表,只要回表次数不多,查询还是很快的,50ms 以内没问题。
starlion
14
starlion 2025 年 6 月 28 日 ❤️ 3
提的问题都不是很清楚,
第一:什么业务类型 ,
第二:估计多大数据量,
第三:业务没办法优化?为什么没办法优化?业务有什么限制、规则?
对业务你做过哪些优化,对 MySQL 、SQL 、硬件等做过哪些优化。

要不然就是一般优化方法:数据能不能分表、存到 NoSQL 类型数据库,ES 、ClickHouse 等、或者大数据计算,Flink 、预先计算 ,。。。
815979670
15
815979670 2025 年 6 月 28 日
大表的具体信息呢,单表多少数据?有多少字段?查询条件是怎样的?目前查询效率是多少?如果没有这些信息的话不太好给出合理的建议。
不过既然考虑更换数据库的话,Clickhouse 可以试一下,我们就是从 MySQL 迁移部分业务到 ClickHouse 了,目前数据量最多的项目 单机单表 过百亿是有的,查询效果还能接受,而且 Clickhouse 压缩率很高 磁盘体积占用减了不少
dddd1919
16
dddd1919 2025 年 6 月 28 日
@dzdh #4 manticosearch 理解,pg 也可以么?
bxb100
17
bxb100 2025 年 6 月 30 日
这不就是典型的列式存储的应用吗, 上 clickhouse + CDC 呗
wangYQ
18
wangYQ 2025 年 6 月 30 日
Mongodb 也不是魔法啊。 还得看:
1.单表多少数据
2.列的数量
3.需要排序的字段都是什么类型
4.查询的 SQL 能不能再进行优化
然后从业务方式能不能处理。不能处理。看数据能不能冷热处理一下。都不行,在考虑用其他类型的数据库呗
dzdh
19
dzdh 2025 年 7 月 1 日
@dddd1919 #16 tsvector 可以自己拼结构。加上索引一样的。千万级不是啥问题。
关于 · 帮助文档 · 自助推广系统 · 博客 · API · FAQ · Solana · 2848 人在线 最高记录 6679 · Select Language 创意工作者们的社区 World is powered by solitude VERSION: 3.9.8.5 · 27ms · UTC 13:13 · PVG 21:13 · LAX 05:13 · JFK 08:13
♥ Do have faith in what you're doing.

AltStyle によって変換されたページ (->オリジナル) /