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

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

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

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

-------
正常来说,百万以下的数据行加索引,不太会导致“msyql 少了几分钟的记录”这样的问题
Xusually
2023-01-07 15:06:00 +08:00
@fanyingmao #3 数据量倒是不大,但是你这负载 100%,加索引肯定直接卡住
最好的办法,就是先发停机预告公告,找业务低峰期停机,改完验证好再重新开启服务。
leonme
2023-01-07 15:07:33 +08:00
@fanyingmao #3 主从切换是可以的。但不太理解这是什么业务,22w 肯定是读多写少,理论上低峰期直接加就行了,顶多几秒的阻塞。
DinnyXu
2023-01-07 15:07:38 +08:00
建一张结构一致的新表,把索引加好,然后把老表的数据转移到新表里面。22 万的数据量很快就转移了,唯一需要注意的是老表数据转移的时候最新的数据会无法立即同步到新表,你只需要查一定的数量进行转移即可,然后再业务低峰期时再把剩余的数据同步到新表
fanyingmao
2023-01-07 15:37:50 +08:00
@leonme #10
22w 慢是,有几万条的数据对 22w 条做关联查询导致的。
现在不敢做太多代码修改,怕影响业务,先把定时查询的频率降低了。现在 mysql cpu 下来了,等后面停服维护加索引。
Jooooooooo
2023-01-07 16:05:23 +08:00
用临时表
mianhk
2023-01-07 20:13:13 +08:00
用 pt-osc 或者 gh-ost 工具,22w 数据量不大,tps 如果不是太高的话很快就好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/907162

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX