引言
在生产环境中,数据库性能问题往往是系统瓶颈的根源。一个未经优化的查询可能从几毫秒拖慢到几秒,直接影响用户体验。本文将分享 MySQL 性能优化的核心策略和实战技巧。
一、诊断性能问题
1.1 开启慢查询日志
-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
-- 设置慢查询阈值(秒)
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log = 'ON';
1.2 使用 EXPLAIN 分析查询
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
重点关注:type(访问类型)、key(使用的索引)、rows(扫描行数)
二、索引优化策略
2.1 创建合适的索引
-- 单列索引
CREATE INDEX idx_email ON users(email);
-- 复合索引(注意最左前缀原则)
CREATE INDEX idx_name_age ON users(name, age);
-- 覆盖索引(避免回表)
CREATE INDEX idx_covering ON orders(user_id, status, created_at);
2.2 索引使用技巧
- 避免在索引列上使用函数:
WHERE DATE(created_at) = '2024-01-01'❌ - 使用范围查询:
WHERE created_at >= '2024-01-01'✅ - 避免
SELECT *,只查询需要的字段
三、查询优化实战
3.1 JOIN 优化
-- 确保 JOIN 字段有索引
SELECT o.id, u.name
FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE o.status = 'completed';
3.2 分页优化
-- 传统分页(深分页性能差)
SELECT * FROM orders ORDER BY created_at DESC LIMIT 10000, 20;
-- 优化方案:使用子查询或游标
SELECT * FROM orders
WHERE created_at < '2024-01-01 00:00:00'
ORDER BY created_at DESC
LIMIT 20;
3.3 批量操作
-- 避免循环单条插入
INSERT INTO logs (user_id, action) VALUES (1, 'login');
INSERT INTO logs (user_id, action) VALUES (2, 'login');
-- 使用批量插入
INSERT INTO logs (user_id, action) VALUES
(1, 'login'),
(2, 'login'),
(3, 'login');
四、表结构优化
4.1 选择合适的数据类型
- 用
TINYINT代替INT存储状态值 - 用
VARCHAR代替TEXT(当长度可预测时) - 用
UNSIGNED存储非负数
4.2 垂直分表
-- 将大字段分离到扩展表
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
CREATE TABLE users_profile (
user_id INT PRIMARY KEY,
bio TEXT,
avatar VARCHAR(255)
);
五、配置优化
# my.cnf 关键配置
[mysqld]
# 缓冲池大小(建议物理内存的 50-70%)
innodb_buffer_pool_size = 4G
# 日志文件大小
innodb_log_file_size = 512M
# 连接数
max_connections = 500
# 查询缓存(MySQL 5.7)
query_cache_size = 64M
query_cache_type = 1
六、监控与维护
6.1 定期检查
-- 查看表大小
SELECT table_name, data_length, index_length
FROM information_schema.tables
WHERE table_schema = 'your_database'
ORDER BY data_length DESC;
-- 分析表(更新统计信息)
ANALYZE TABLE users;
-- 优化表(整理碎片)
OPTIMIZE TABLE orders;
总结
数据库优化是一个持续的过程。关键要点:
- 先用
EXPLAIN诊断,再优化 - 索引不是越多越好,要精准
- 避免 N+1 查询问题
- 定期监控慢查询
- 根据业务场景调整配置
记住:优化的前提是测量,没有基准的优化都是盲目猜测。
文章评论