V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
CooperB
V2EX  ›  MySQL

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

  •  
  •   CooperB · 6 天前 · 2895 次点击

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

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

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