MySQL运维与设计避坑指南:90% DBA都踩过的5个经典陷阱
|
索引不是越多越好,盲目添加索引反而拖垮性能。很多DBA在慢查询出现后第一反应是“加索引”,却忽略索引本身有维护成本:INSERT/UPDATE/DELETE需同步更新B+树,写入放大明显;更严重的是,重复索引(如已有联合索引(a,b),又单独建a索引)和冗余索引(如(a,b,c)与(a,b)并存)会浪费磁盘空间、加剧Buffer Pool竞争,甚至干扰优化器选择最优执行计划。上线前务必用pt-duplicate-key-checker或information_schema统计索引使用率,删除3个月内未被命中的索引。 字符集与排序规则混用埋下数据截断与比较异常的隐患。常见错误是建库用utf8mb4,但建表时漏写CHARACTER SET,继承了服务器默认的latin1;或在JOIN条件中连接utf8mb4_bin与utf8mb4_general_ci字段,导致隐式转换、索引失效。更隐蔽的是MySQL 5.7默认排序规则为utf8mb4_general_ci(不区分大小写、不区分变音符号),而8.0升级为utf8mb4_0900_as_cs(区分大小写且重音敏感),迁移时若未统一调整,WHERE name='Alice'可能意外匹配'Alice '或'aLICE',引发业务逻辑错乱。 事务隔离级别滥用导致幻读、死锁频发。开发常误以为READ-COMMITTED能完全避免幻读,实则仅解决“当前读”的幻像(如SELECT ... FOR UPDATE),对普通快照读仍可能出现不一致结果;而过度使用SERIALIZABLE虽安全,却以全局锁为代价,吞吐量骤降。更典型的是长事务——一个未提交的UPDATE持有行锁数小时,阻塞后续DDL(如ADD COLUMN)和大量DML,最终触发锁等待超时。应严格遵循“事务最小化”原则,将非数据库操作(如HTTP调用、日志打印)移出事务体。 主从延迟被简单等同于“网络慢”,忽视业务层设计缺陷。当主库执行大事务(如单条UPDATE影响百万行)或从库开启binlog_format=STATEMENT时,从库回放需逐行解析SQL,极易积压;但更致命的是业务代码中依赖“写后立即读从库”的强一致性模型——用户刚下单就跳转到订单列表页,却因从库延迟显示“订单不存在”。正确解法是:关键路径强制走主库读;非关键场景用GTID+主从延迟监控(Seconds_Behind_Master + pt-heartbeat)做兜底降级。 备份策略缺失“可恢复验证”环节。不少团队每月全量mysqldump+binlog归档,却从不演练恢复流程。某次磁盘故障后,发现备份文件因max_allowed_packet设置过小被截断;另一次因未备份mysql系统库,恢复后用户权限全失;最普遍的是未校验备份集完整性(如gzip损坏、xtrabackup中途失败无告警)。必须建立自动化恢复流水线:每日随机抽取备份集,在隔离环境执行完整restore+checksum比对,并生成报告。没有验证过的备份,等于没有备份。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

浙公网安备 33038102330577号