V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
UnrealEngine
V2EX  ›  程序员

线上数据库某些大表几亿以上的数据量,没法通过直接查取数据库数据排查线上问题,如何优化?

  •  
  •   UnrealEngine · 187 天前 · 2028 次点击
    这是一个创建于 187 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司某些大表动辄几亿以上的数据量,主管这边已规定不能直接用 sql 查这种大表(不然即便有索引也会直接卡死……),想排查数据可以用 es 操作(因为是从数据库同步到 es ,然后再由代码读取),但是遇到需要排查数据正误的情况时,就需要查取数据库的原数据来分析代码是否存在插入数据不对的问题。

    一旦遇到这种情况我就懵逼了,我数据库都没法看我咋个快速找到 BUG 根源?

    18 条回复    2024-01-15 15:51:50 +08:00
    jfds
        1
    jfds  
       187 天前
    一般查备库
    yingqiuQAQ
        2
    yingqiuQAQ  
       187 天前
    几个亿的数据不考虑分表,等几十亿的时候再考虑吗(不是)
    cndenis
        3
    cndenis  
       187 天前
    数据库不能查, 那这数据库用来干什么的?
    UnrealEngine
        4
    UnrealEngine  
    OP
       187 天前
    @yingqiuQAQ #2 没办法,主管说了算,俺只是搬砖滴
    UnrealEngine
        5
    UnrealEngine  
    OP
       187 天前
    @yingqiuQAQ #2 现在即便是用 es 查数据但也经常出现卡顿的问题,不知道是不是数据量也跟着变多的原因
    zoharSoul
        6
    zoharSoul  
       187 天前
    几个亿 sql 随便查啊
    yufeng0681
        7
    yufeng0681  
       187 天前
    想办法把数据量变小,
    比如多久以前的数据不会再更新了, 那查询备份表就足以;
    比如只需要复核最近几个月的数据是否有一致性问题,那弄个新表只存最近几个月的数据(利用数据库日志来做同步更新新表),,查询起来也飞快
    guo4224
        8
    guo4224  
       187 天前 via iPhone
    es 也可以直接用 sql……
    Terry166
        9
    Terry166  
       187 天前
    1 ,优化 sql ,上亿的行数就不要用 join 了,只针对单个表进行查询,查询位于主键索引(聚簇索引)上的列,避免回表。避免用 in ( in 导致查询复杂度提升一个数量级,要用 in 的话最多只能放 1000 个值);

    2 ,分库分表;

    3 ,纵向扩展提升机器硬件;

    4 ,利用云计算数据仓库技术( Cloud Data Warehouse platform ),比如 AWS Snowflake ,GCP BigQuery ,或者 Azure Synapse ,把数据库文件导入数据仓库,在查询的时候会自动横向扩展增加机器,查询包含 1000 亿条数据的表也只需要 10 秒左右的时间,费用会根据所查询的列来计算。
    noparking188
        10
    noparking188  
       187 天前
    问主管 binlog 同步哪去了,之前 经历过是用 binlog 同步 HDFS ,Presto 查,千亿数据量
    Tinyang
        11
    Tinyang  
       186 天前
    定期 snapshot 回本地数据库,敏感数据脱敏
    crazycarry
        12
    crazycarry  
       186 天前
    70 亿的表。。有时间索引还好吧,别作死有统计的,,
    RicherWQ
        13
    RicherWQ  
       186 天前
    首先上亿数据很常见,目前你们的处理方式问题很多:
    1.几亿数据为什么不做分库分表?做了分库分表,都是小表就查呗
    2.为什么不让查询?数据库没做主从架构,有了这个架构,查询从库出问题也没啥影响啊
    3.主管技术问题?数据再多用 id 查询单条数据也是问题不大的,先通过 es 查到数据的 ID ,再根据 id 去数据库查询呗
    Orlion
        14
    Orlion  
       186 天前
    1. 依靠索引列缩小扫描行数后再进行复杂查询
    2. 查备库
    burymme11
        15
    burymme11  
       186 天前
    让运维拉一份出事时间段的 binglog 给你。
    Terry166
        16
    Terry166  
       186 天前 via iPhone
    另外用于统计的 query 比如 sum ,average 等,以及 where 子句条件不精确,会导致索引失效,全表扫描,不适合 OLTP 型数据库。
    sampeng
        17
    sampeng  
       186 天前
    都几亿数据了。你要说没备份库我是不信的
    jones2000
        18
    jones2000  
       186 天前
    库不是要同步到 es , 那就说明 es 同步工具是可以访问数据库的, 把错误的这条记录删了, 然后同步下, 记录同步日志, 把这条同步的记录的内容都打印出来,不就是数据库的内容。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1356 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 17:32 · PVG 01:32 · LAX 10:32 · JFK 13:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.