1
leonme 2023-01-07 13:38:55 +08:00 via iPhone
低峰期加,其他方式都依赖完善的运维平台
|
2
leonme 2023-01-07 13:39:49 +08:00 via iPhone
目前单表多少数据量呢?日常 DB 负载如何?
|
3
fanyingmao OP |
4
bjzhush 2023-01-07 13:59:06 +08:00
当然是凌晨三点半夜鸡叫的时候加
另外现在都支持 online DDL 了,https://www.cnblogs.com/dbabd/p/10381942.html 可以参考 |
5
yianing 2023-01-07 14:11:09 +08:00 via Android 1
ghost mysql https://github.com/github/gh-ost
|
6
dzdh 2023-01-07 14:13:46 +08:00
使用过类似工具。
原理这样的(要求是 innodb 表) 1. 新建随机名空表(使用源表的 create 语句+变更 DDL ) 2. 源表增加触发器,cud SQL 同步到 新创建的表 3. 执行老分批 SQL ,每次 5000 条数据 select 出来 replace 到新表 4. 事物删除触发器、老、新表改名。 5. 验证结果 |
8
leonme 2023-01-07 15:03:54 +08:00
@fanyingmao #3 如果只有 22w 条记录,db 负载是 100%。建议先升级 DB 机器配置或应用层进行优化(缓存或其他手段),让峰值时 DB 负载降到至少 60%以下,然后直接加索引就行。
------- 正常来说,百万以下的数据行加索引,不太会导致“msyql 少了几分钟的记录”这样的问题 |
9
Xusually 2023-01-07 15:06:00 +08:00
@fanyingmao #3 数据量倒是不大,但是你这负载 100%,加索引肯定直接卡住
最好的办法,就是先发停机预告公告,找业务低峰期停机,改完验证好再重新开启服务。 |
10
leonme 2023-01-07 15:07:33 +08:00
@fanyingmao #3 主从切换是可以的。但不太理解这是什么业务,22w 肯定是读多写少,理论上低峰期直接加就行了,顶多几秒的阻塞。
|
11
DinnyXu 2023-01-07 15:07:38 +08:00
建一张结构一致的新表,把索引加好,然后把老表的数据转移到新表里面。22 万的数据量很快就转移了,唯一需要注意的是老表数据转移的时候最新的数据会无法立即同步到新表,你只需要查一定的数量进行转移即可,然后再业务低峰期时再把剩余的数据同步到新表
|
12
fanyingmao OP @leonme #10
22w 慢是,有几万条的数据对 22w 条做关联查询导致的。 现在不敢做太多代码修改,怕影响业务,先把定时查询的频率降低了。现在 mysql cpu 下来了,等后面停服维护加索引。 |
13
Jooooooooo 2023-01-07 16:05:23 +08:00
用临时表
|
14
mianhk 2023-01-07 20:13:13 +08:00
用 pt-osc 或者 gh-ost 工具,22w 数据量不大,tps 如果不是太高的话很快就好了
|