没有玫瑰的情人节,只有服务器日志里堆积如山的垃圾数据。团队里的小年轻们今天心思都飘了,效率低得吓人,我干脆把他们全轰走,自己留在公司。关掉所有社交软件的通知,戴上降噪耳机,世界只剩下机柜风扇的低频嗡鸣和屏幕上滚动的命令行。这种时候,给数据库做大扫除,比任何鲜花巧克力都让我感到踏实。
控制感。这是我今年最缺的东西。去年膨胀得太快,接了几个大单,招了五个人,办公室从居民楼搬到了正经的写字间。账面上的流水是好看,可人呢?管人比写代码难一万倍。你得盯着进度,调和矛盾,画饼,发火,再自己把饼圆回来。每天醒来就是各种“请示”和“突发状况”,我那个引以为傲的、能精准抓取任何网站数据的爬虫框架,已经快半年没更新过一个版本了。我的技术手感在生锈,而管理带来的反馈绵软又迟滞,像一拳打在棉花上。只有回到服务器面前,回到这些由0和1构成的、逻辑清晰的世界里,我才能重新呼吸。
今天的目标很明确:清理那台主力MySQL实例。业务跑了一年多,没人系统性地做过索引优化和日志归档。`show processlist` 一看,好几个慢查询挂着,`Waiting for table metadata lock`。这感觉就像血管里堵了血栓。我先从最占地方的日志表下手,`access_log_2020` 这种,按日期分区早就该做了,之前一直用最蠢的`delete from table where create_time < '2020-01-01'`,一删锁全表,业务直接卡死。今天必须上`pt-archiver`,写脚本,一点点把历史数据挪到归档实例,再在原表上`drop partition`。这活儿不能急,参数调不好容易把线上搞崩。 一边跑着归档脚本,一边分析现有的索引。用`pt-index-usage`读慢查询日志,发现好多联合索引字段顺序根本不对,最常用的查询条件`user_id`居然排在第三个。还有一堆单列索引,根本没人用,白白拖慢插入速度。这肯定是当初为了赶上线,DBA(其实就是我自己)拍脑袋建的。每一处不合理的索引,都是过去某个慌乱时刻的墓碑。我一条条地`ALTER TABLE ... DROP INDEX ...`, `ADD INDEX ...`。每执行完一条,看着监控图里那根代表查询时间的线往下掉一点,心里就舒坦一分。这是一种近乎生理性的愉悦,直接、可测量、没有歧义。比跟客户解释“为什么这个需求要加钱”爽快多了。 窗外应该挺热闹吧,但我连头都没抬。咖啡机坏了,喝的是自动贩卖机的罐装黑咖,齁甜,但能提供咖啡因就行。手机屏幕亮过一次,是某个鲜花品牌的促销短信,我直接划掉了。在这个由`innodb_buffer_pool_size`和`thread_cache_size`参数构成的情人节夜晚,我感到一种奇异的平静。团队、客户、合同、现金流……那些让我焦虑到失眠的东西暂时被屏蔽了。这里只有问题,和确定的、可执行的解决方案。`EXPLAIN` 语句返回的执行计划,比任何情话都更清晰明了。 归档脚本跑完了,慢查询数量从高峰的两位数降到了个位数。我做了个全库`mysqldump`备份到异地,然后重启了实例。看着服务平稳地重新启动,各项监控指标恢复正常甚至更好,我靠在椅背上,长长地吐了一口气。这一刻的成就感是真实的,虽然微不足道,但它完全属于我。管理一个公司,你永远不知道是哪里出了问题;但优化一个数据库,你知道每一个瓶颈在哪里,也知道每一分提升从何而来。也许,我骨子里还是个手艺人,只是不小心当了一阵子包工头。 关机,锁门。写字楼空荡荡的,电梯下行时失重的感觉格外明显。回到车上,连广播都懒得开。今天没有玫瑰,但我的数据库`QPS`提升了百分之十五,索引命中率达到了九成八。这大概是一个三十五岁、陷入交付泥潭的产品经理,所能给自己最硬核的情人节礼物了。














