V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fanyingmao
V2EX  ›  问与答

线上环境 msyql 要怎么加索引不会影响业务?

  •  
  •   fanyingmao · 2023-01-07 12:28:01 +08:00 · 1981 次点击
    这是一个创建于 695 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前线上 mysql 加导致 msyql 少了几分钟的记录,现在又有慢查询,要怎么不影响业务下加索引?
    感觉遗漏索引应该是很容易碰到的,有解决方案吗?
    14 条回复    2023-01-07 20:13:13 +08:00
    leonme
        1
    leonme  
       2023-01-07 13:38:55 +08:00 via iPhone
    低峰期加,其他方式都依赖完善的运维平台
    leonme
        2
    leonme  
       2023-01-07 13:39:49 +08:00 via iPhone
    目前单表多少数据量呢?日常 DB 负载如何?
    fanyingmao
        3
    fanyingmao  
    OP
       2023-01-07 13:45:00 +08:00
    @leonme #2
    数据量是 22w 条
    db 负载是 100%
    有做主从,查了好像可以在从数据库加索引然后做主从切换的方法,不懂可不可行。
    bjzhush
        4
    bjzhush  
       2023-01-07 13:59:06 +08:00
    当然是凌晨三点半夜鸡叫的时候加
    另外现在都支持 online DDL 了,https://www.cnblogs.com/dbabd/p/10381942.html 可以参考
    yianing
        5
    yianing  
       2023-01-07 14:11:09 +08:00 via Android   ❤️ 1
    dzdh
        6
    dzdh  
       2023-01-07 14:13:46 +08:00
    使用过类似工具。

    原理这样的(要求是 innodb 表)

    1. 新建随机名空表(使用源表的 create 语句+变更 DDL )
    2. 源表增加触发器,cud SQL 同步到 新创建的表
    3. 执行老分批 SQL ,每次 5000 条数据 select 出来 replace 到新表
    4. 事物删除触发器、老、新表改名。
    5. 验证结果
    8355
        7
    8355  
       2023-01-07 14:34:42 +08:00
    @dzdh #6 灾难
    leonme
        8
    leonme  
       2023-01-07 15:03:54 +08:00
    @fanyingmao #3 如果只有 22w 条记录,db 负载是 100%。建议先升级 DB 机器配置或应用层进行优化(缓存或其他手段),让峰值时 DB 负载降到至少 60%以下,然后直接加索引就行。

    -------
    正常来说,百万以下的数据行加索引,不太会导致“msyql 少了几分钟的记录”这样的问题
    Xusually
        9
    Xusually  
       2023-01-07 15:06:00 +08:00
    @fanyingmao #3 数据量倒是不大,但是你这负载 100%,加索引肯定直接卡住
    最好的办法,就是先发停机预告公告,找业务低峰期停机,改完验证好再重新开启服务。
    leonme
        10
    leonme  
       2023-01-07 15:07:33 +08:00
    @fanyingmao #3 主从切换是可以的。但不太理解这是什么业务,22w 肯定是读多写少,理论上低峰期直接加就行了,顶多几秒的阻塞。
    DinnyXu
        11
    DinnyXu  
       2023-01-07 15:07:38 +08:00
    建一张结构一致的新表,把索引加好,然后把老表的数据转移到新表里面。22 万的数据量很快就转移了,唯一需要注意的是老表数据转移的时候最新的数据会无法立即同步到新表,你只需要查一定的数量进行转移即可,然后再业务低峰期时再把剩余的数据同步到新表
    fanyingmao
        12
    fanyingmao  
    OP
       2023-01-07 15:37:50 +08:00
    @leonme #10
    22w 慢是,有几万条的数据对 22w 条做关联查询导致的。
    现在不敢做太多代码修改,怕影响业务,先把定时查询的频率降低了。现在 mysql cpu 下来了,等后面停服维护加索引。
    Jooooooooo
        13
    Jooooooooo  
       2023-01-07 16:05:23 +08:00
    用临时表
    mianhk
        14
    mianhk  
       2023-01-07 20:13:13 +08:00
    用 pt-osc 或者 gh-ost 工具,22w 数据量不大,tps 如果不是太高的话很快就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5081 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:10 · PVG 09:10 · LAX 17:10 · JFK 20:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.