DBA熬夜改表?这本MySQL手册让设计运维一步到位
|
我原以为就是加个字段,alter table加个comment_text varchar(2000) not null default '',DBA说十分钟完事——结果他蹲在公司改到凌晨三点十七分,群里飘着“手抖删了主键”“回滚失败”“从库没跟上”三条消息,中间穿插老张发了个[捂脸]表情包,第四个是半截烟头截图,灰都掉键盘缝里了。 那天雨下得特别闷,窗玻璃全是水痕,我阳台三件衬衫没收,第二天全发潮味。隔壁装修电钻声从晚上九点响到十一点四十二分,中间停了七分钟,够我查三次收录、刷新五次快照、又清空浏览器缓存重登站长平台——可搜索框里输“site:xxx.com”还是只蹦出三百七十二个词,比上周三少了将近一半。 客户早上八点零三分发来截图:“友链那边说你们首页打不开”,配图是他们站点右下角的友情链接区域,我们的域名灰掉了。我切过去看,页面确实卡在loading,F12一看network标签页,/api/v2/home那个请求状态栏一直转圈,但console里连报错都没有,就一行浅灰色字:`Failed to load resource: net::ERR_CONNECTION_TIMED_OUT`。我点了三次刷新,第四次才出来,第五次又没了。我敢打包票——这个超时不是PHP的事,是MySQL主从延迟卡在那了,而延迟根源就是那张被ALTER了八次的article表。 这事儿要往前推,得翻到六月二号下午。运维小马把建表语句丢进GitLab Merge Request里,标题写着“适配新评论区字段”,我扫了一眼,没动索引,没改ENGINE,就加了两个字段,一个text一个datetime。DBA老陈当时回了个“OK”,还补了句“顺手把id改成bigint”,我就没再盯。可他“顺手”之后,当晚采集脚本就开始掉任务,不是抓取失败,是返回200但body空——对,你没听错,HTTP状态正常,HTML源码里干干净净,连DOCTYPE都没有,就一个空格加回车。我们仨对着日志查到半夜,最后发现是select from article where status=1 order by create_time desc limit 100这个SQL,在新加的comment_text字段上有like查询,而它根本没建索引。可没人知道谁写的这个like,它藏在后台CMS的模板渲染层里,压根不走接口。 我说这话不是甩锅——我自己当年也干过类似事。2018年做站群,三个站共用一套评论模块,我把user_id字段从int改成bigint没通知前端,结果所有站的回复按钮都点不动,用户发的每条评论在数据库里id末尾都多了个L,Python读取时直接类型错误崩掉。那次我跪着改了六个小时的ORM映射,还挨了甲方一句:“你这架构师当得跟修自行车似的。” 现在回头看这本手册,第47页写“大表DDL必须配合pt-online-schema-change或gh-ost,禁止直接ALTER”,第62页标红强调“text/blob字段不建议设为NOT NULL且无默认值,尤其当表已超五百万行”,第89页附了个真实case:某电商在商品详情页加了个JSON格式的‘规格参数’字段,没拆表,三个月后全文索引全崩,因为MySQL5.7的FULLTEXT索引对JSON内容解析是逐字符扫描……这些话,我看的时候手心全是汗,不是怕,是后怕——原来我们踩的坑,早就有人踩过,还把坑边的土都拍实了,写成铅字放在书脊朝外的位置。 优胜劣汰?真不是喊口号。我认识两个同行,一个坚持用MyISAM存文章表(“快啊,你看读速度!”),另一个在InnoDB里给每个varchar字段都加fulltext。前年搜索引擎算法一调,前者首页快照直接倒退到2019年4月,后者索引量掉得像断线风筝——可俩人到现在还互相拉黑着微信,逢年过节互发红包都不点开。手册里没提这事,但它把“为什么MyISAM不适合现代Web场景”写了两整页表格对比,光是锁粒度那一栏就列了七种并发场景下的响应时间差。这种细节,不是教你怎么赢,是告诉你哪条路走下去连尸体都找不到。
文章配图,仅供参考 对了,昨天下午客户催第三次,电话里说“你们那个‘相关推荐’模块,昨天百度PC端还有十条,今天手机端只有两条,而且全是半年前的老文”。我没接话,挂了电话打开phpMyAdmin,盯着article表的key_buffer_size设置看了四分钟。窗外雨停了,老张在群里扔了张图:他媳妇刚晾的床单被风吹得贴在防盗网上,像面投降的白旗。 我删了两遍缓存,重启了两次php-fpm,最后把article_comment字段从NOT NULL改成了NULL,default留空,没设值,只改类型。DBA老陈今早回我:“这次不用熬夜,十五分钟内完成”。我没回,把书翻到第113页,那里画了个手绘箭头,指向一段加粗小字:“不要指望一次改表修复所有问题。设计即运维,运维即设计。没有‘临时方案’,只有‘提前暴露’。” 明天先把手上那批带‘最新评论’widget的页面删一半试试。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


MySQL性能优化实战:15年经验的全链路提速之道