今天咱们聊聊数据库优化这件事。很多刚入行的开发者遇到系统变慢,第一反应就是加服务器,其实很多时候问题出在数据库上。作为师傅,我带你从查询优化到备份恢复,一步步把 MySQL 调教好。
先说查询优化。你打开慢查询日志,看看哪些 SQL 执行超过一秒。最常见的问题是缺少索引。比如你有个用户表,经常按手机号查询,那就给手机号字段加上索引。执行 CREATE INDEX idx_phone ON users(phone) 就行。但索引不是越多越好,每次写入都要更新索引,太多反而拖慢写入速度。
另一个常见问题是 SELECT *。我见过太多人不管需要啥字段,直接星号全查。假设你只需要用户名和邮箱,那就写 SELECT name, email FROM users。这样数据库不用读取整行数据,网络传输的数据量也小。特别是表里有 TEXT 或 BLOB 字段时,这个优化效果非常明显。
JOIN 操作也要小心。两个大表关联时,确保关联字段都有索引。如果 A 表的 user_id 关联 B 表的 id,那这两个字段都要建索引。还有,避免在 WHERE 条件里对字段做函数运算,比如 WHERE DATE(create_time) = ‘2026-03-29’ 会导致索引失效,改成 WHERE create_time >= ‘2026-03-29 00:00:00’ AND create_time backup.sql 就能导出整个数据库。恢复的时候用 mysql -u root -p database_name < backup.sql。但这有个问题,导出时表会被锁定,大表会影响业务。
生产环境建议用主从复制做热备。配置一个从库,实时同步主库数据,然后对从库做备份,这样不影响主库服务。如果已经用了云服务器,开启自动快照功能,每天凌晨自动备份,双重保险更安心。
恢复测试很多人会忽略。我见过备份文件存了好几年,真到要恢复时发现文件损坏或者密码忘了。每季度至少做一次恢复演练,把备份文件恢复到测试环境,验证数据完整性。这个习惯能救你的命。
最后说点进阶的。如果单表数据超过千万行,考虑分表或者归档历史数据。把一年前的订单移到 archive 表,主表保持轻量。读写分离也是个好方案,主库负责写入,多个从库分担读取压力。
数据库优化是个持续的过程。上线后定期看慢查询日志,分析执行计划,根据实际业务调整索引。记住,没有银弹,只有最适合你业务的方案。今天讲的这些,够你应付大部分场景了。遇到问题别慌,先看日志,再查文档,实在不行找师傅商量。