站长必避的3个MySQL设计陷阱
|
去年二月,我蹲在IDC机房第三排机柜后面查网关日志,空调滴水正砸在左肩上,湿了一小片——不是漏水,是隔壁空调冷凝管年久失修,就那么悬着,一滴、一滴、一滴。这时候站长老张端着泡面进来,鞋跟磕在防静电地板上,咔、咔、咔,三声,比监控告警还准。他蹲下来,指着我屏幕上刚导出的慢查询列表:“王工,你看这SQL跑得比蜗牛快不了多少,是不是你们网关加了啥中间件拖慢了?”我抬头看他左手食指指甲缝里还嵌着黑灰,估计刚拧完交换机风扇。我说你先把面放稳,别泼我键盘上。他嗯一声,把红烧牛肉面搁在UPS外壳上,热气直往我显示器边框上扑。 第一坑:bigint当主键,非要用UUID做业务主键再加个auto_increment id当“物理主键”——这不叫冗余,这叫自废武功。我原以为只是索引体积大点,结果上周三凌晨两点,他们那个订单表INSERT卡住四十七秒,MySQL自己把插入线程挂了三次。你猜为啥?因为二级索引页分裂时反复回表找UUID字段,而UUID是乱序写入,B+树疯狂重平衡。老张说他们团队当初是为了“方便前端传参”,我说你前端传个int64不好吗?他舔了下嘴唇,没接话。对了,那天值班的实习生小刘,一边敲kill -9一边啃奥利奥,碎渣掉进键盘缝里,我听见咔嚓声比他敲enter还脆。 第二坑:text字段塞JSON,还不加生成列、不建虚拟索引。我说你至少抽个status字段出来单独建索引,他说“都是动态字段,没法预设”。好,去年十一月底上线后第五天,他们首页瀑布流突然加载超时,Nginx返回502二十一次。我们切到DB层查,发现全表扫描那个article_meta表,单次读取三万两千行,IO队列堆到八百毫秒。后来查出来是某个运营同学手抖,在后台编辑器里粘贴了个带十六层嵌套的JSON,里面混了base64图片字符串。数据库内存撑不住,buffer pool churn得像被狗刨过。我截图发群里时,运维老陈正喝枸杞茶,杯子盖子没拧紧,漏了一滴在我笔记本右下角,现在还留着黄印。
文章配图,仅供参考 第三坑:时间字段全用datetime,且全部默认CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。我说你分一分场景行不行?创建时间需要更新?订单状态变更时间需要自动改创建时间?他们文档写得倒是漂亮,“统一时间治理规范”,可执行起来就是一把梭。结果去年十二月中旬那波促销,库存扣减服务批量更新order表,连带着把create_time全刷成下单瞬间,下游数仓跑出来的转化漏斗图,首访用户停留时长全是负值。BI组小姑娘来问,我让她先去茶水间煮壶咖啡——她回来时拎着保温杯,杯身印着“加油!2023”,可杯盖旋钮松了,走一路漏一路水,洇湿了半张ER图打印稿。 说到这儿我突然想起来,前天网关日志里扫到一条异常trace:某个站点的/call-back接口每分钟涌进三百七十二个重复幂等请求,但他们的MySQL表里,幂等键是(biz_id, create_time),而create_time是datetime,精度秒级——也就是说,同一秒进来的三百多个请求,全撞进同一个唯一索引冲突。MySQL报错1062,他们后端就重试,重试又撞,恶性循环。我提了PR加microsecond精度,老张说DBA不同意,说“会影响备份恢复速度”。我笑了下,没争。其实我敢打包票,他们那台从阿里云迁过来的RDS实例,磁盘IO吞吐从来就没满过70%,所谓影响,纯属嘴硬。 我昨天翻他们DDL语句,看见comment字段写了“用户备注信息,最大支持200字符”,结果有六十七个实例里,这个字段实际存了五百三十一字符的Markdown文本,还有人塞了script标签。没人删,没人预警,没人巡检——系统就那么活着,像食堂窗台上那盆绿萝,叶子发黄卷边,根泡在浑水里,可它偏不死,还冒新芽。我不确定这算韧性还是苟延残喘。 前天傍晚下雨,雨特别密,打在IDC玻璃幕墙上全是白噪,听不清人说话。老张电话响了,他接起来只说一句“在机房”,就把手机夹在耳朵和肩膀之间,继续看我写的ALTER TABLE脚本。我没抬眼,只看见他右手拇指无意识摩挲左手腕表表带,那块表是卡西欧F-91W,塑料壳泛黄,秒针走一步,咔哒,再走一步,咔哒。我觉得有点困,但不想说。 所以啊,这仨坑真不是技术难度问题,是“能跑就行”思维结的痂。优胜劣汰?对,跑不过去的站点死得快,活得久的反倒把烂设计当勋章。我现在每次review DDL都先翻他们的监控埋点有没有开performance_schema.events_statements_history_long,没开的,我直接退出评审会,不聊。至于怎么开……你得先说服他们把my.cnf里performance_schema=OFF改成ON,然后再教他们别怕多占三百兆内存。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


ASP新手必避的7大运维陷阱,第5个90%人仍在踩
元数据驱动:无障碍设计创业的双轮技术基石
创业信息流设计:流量、合规、效率的三角平衡术
MySQL运维与设计五大致命坑(13年实战避坑指南)
媒体网站无障碍设计:9个技术盲区适配要点
iOS工程师私藏:交互式网站设计破同质化
Linux与Windows服务器选型的5大性能陷阱

