行业动态
聚焦行业前沿,洞察趋势风向
长运数据库扛了三年,终于顶不住了啦。
每天早高峰,运营后台点个查询,转圈能转十秒。
业务那边骂娘,技术这边背锅。
这不是个别现象,是系统整体老化。
我们决定动手调优,不搞虚的,就干实事。
先看慢查询日志,一抓一大把。
最多的是一条订单汇总SQL,跑了八秒。
表里两千万行,没走索引,全表扫描。
这种写法放在三年前没问题,现在数据量翻倍,直接卡死。
改法很简单:加复合索引,拆掉子查询,用JOIN代替。
改完跑了一秒二。
第一刀就见效,团队士气上来了。
但光改SQL不够。
长运数据库的CPU经常飙到90%,内存也不够用。
我们查了缓冲池命中率,只有75%,太低。
正常应该在95%以上。
原因很简单:innodb_buffer_pool_size设置太小,只有4G。
服务器物理内存32G,愣是没充分利用。
调成20G,命中率升到97%,CPU降到40%。
这一步没花一分钱,纯配置调整。
接着处理慢索引。
有些表索引建得乱七八糟,重复的、没用的,一大堆。
我们写了脚本统计索引使用情况,把半年没用过的索引全删了。
删了大概三分之一。
写入性能立刻提升,因为每次插入都要维护索引,索引越少越快。
删完磁盘占用也小了两百G,备份时间从四十分钟缩到十五分钟。
还有个大问题:锁等待。
运营系统经常同时更新同一个用户的余额,行锁冲突严重。
我们用SHOW ENGINE INNODB STATUS看了下,好多事务等锁超时。
业务逻辑本身没问题,就是并发太高。
对策是改事务隔离级别,从REPEATABLE READ降到READ COMMITTED。
这个调整对准确性没影响,因为业务里没有需要可重复读的场景。
改完锁等待直接降了八成。

中间也踩过坑。
有一次为了省事,把一个大查询改成缓存,结果数据老是过期,业务投诉不断。
后来想明白了,缓存适合热点数据,但长运的订单数据更新频繁,缓存一致性难保证。
干脆放弃缓存,专心把数据库本身调好。
现在查询快,写入也稳,不靠缓存糊弄人。
最后一点是硬件层面。
我们用了SSD,但发现随机读写还是慢。
查下去原因,是磁盘队列深度设置不对。
把IO调度器从cfq改成noop,延迟降了一半。
这个操作五分钟搞定,效果立竿见影。
调优前后对比,最直观的数字:
接口平均响应时间从2.3秒降到0.4秒。
数据库CPU使用率从85%降到25%。
慢查询数量从每天三百多次变成零。
业务那边没人骂了,反而问我们是不是加了新机器。
其实一台没加,全靠把现有资源榨干。
心得有三条。
第一,先看慢日志,别猜。
数据会告诉你问题在哪,瞎调是浪费时间。
第二,配置要匹配业务。
默认参数是给通用场景的,长运这种高并发读写,必须手动调。
第三,小步快跑,每改一步都验证效果。
不要一次改十个参数,出问题你都不知道哪个引起的。
现在长运数据库状态很健康,能扛住双十一两倍峰值。
我们还在持续监控,每周看一次关键指标。
性能调优不是一锤子买卖,是长期维护。
这次实践没什么高深技术,就是按常识办事。
但常识往往最容易被忽略。
慢查询; 缓冲池; 锁等待; 索引优化;