做数据工作的人都知道,数据库跑得慢,整个人都不好了。特别是月底出报表的时候,点一下查询卡半分钟,咖啡都凉了还没出结果。其实很多时候不是数据库不行,而是我们没用对方法。
别让查询字段裸奔
很多人写 SQL 习惯 select *,看着省事,实际坑得要命。尤其表里有 text 或 blob 字段时,查一整行等于把硬盘翻一遍。只选需要的字段,能明显减轻 IO 压力。比如你只是核对用户手机号,那就明确写:
SELECT user_id, phone FROM users WHERE status = 1 AND created_time > '2024-01-01'
索引不是越多越好
看到查询慢就加索引,这是新手常踩的坑。索引确实能提速查询,但每多一个索引,插入和更新就会更慢一点,因为数据库得同步维护这些“目录”。更麻烦的是,组合索引顺序搞反了,等于白建。比如你经常按城市和注册时间查用户,那应该建 (city, created_time),而不是反过来。
分页查询别用 offset
数据量一大,limit 10000, 20 这种写法直接让数据库喘不过气。它得先跳过一万条记录,哪怕你根本不需要。更好的办法是用主键或时间戳做条件过滤,比如上一页最后一条记录的时间是 '2024-03-20 10:23:45',下一页就可以:
SELECT id, name, created_time
FROM logs
WHERE created_time > '2024-03-20 10:23:45'
ORDER BY created_time
LIMIT 20
善用执行计划看真相
MySQL 的 explain 命令就像 X 光片,能照出 SQL 到底怎么执行的。重点关注 type 是否用了 index 或 range,key 是否命中了索引,rows 扫了多少行。如果看到 type=ALL,基本就是全表扫描,赶紧优化去。
定时任务避开高峰期
有些公司喜欢半夜跑统计任务,这挺好,但别一股脑全塞在凌晨两点。多个大表同时分析,CPU 直接拉满。可以错开时间,比如用户行为日志三点跑,订单汇总三点半跑,给系统喘口气的机会。
数据库性能优化不是一锤子买卖,更多是日常细节的积累。改一条 SQL,加一个索引,调整一次任务时间,可能就让整个系统顺畅不少。