mysql 性能优化入门
MySQL 性能优化是一个复杂的过程,涉及数据库设计、查询优化、索引优化、配置调整等多个方面。以下是一些实战技巧和建议:
1. 查询优化
避免全表扫描
确保查询条件(WHERE
、JOIN
)字段上有索引,避免全表扫描。
-- 优化前(可能全表扫描)
SELECT * FROM users WHERE created_at > '2023-01-01';-- 优化后(添加索引)
ALTER TABLE users ADD INDEX idx_created_at (created_at);
优化子查询
用JOIN
替代子查询,减少查询执行次数。
-- 优化前(子查询)
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders);-- 优化后(JOIN)
SELECT u.name FROM users u JOIN orders o ON u.id = o.user_id;
2. 索引优化
创建复合索引
根据查询条件组合创建索引,注意最左匹配原则。
-- 为同时查询user_id和status的场景创建复合索引
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
避免冗余索引
删除重复或不必要的索引,例如已有(a, b)
索引,再创建(a)
索引是冗余的。
3. 数据库设计优化
合理使用数据类型
- 用
TINYINT
替代INT
存储布尔值或小范围数值。 - 用
VARCHAR
替代CHAR
节省空间。
-- 优化前
CREATE TABLE users (is_active INT, -- 可优化为TINYINTusername CHAR(50) -- 可优化为VARCHAR
);-- 优化后
CREATE TABLE users (is_active TINYINT,username VARCHAR(50)
);
垂直拆分大表
将不常用字段拆分到单独的表,减少查询时的数据读取量。
4. 配置优化
调整内存分配
根据服务器内存调整innodb_buffer_pool_size
(推荐物理内存的 50%-75%)。
# my.cnf 配置示例
[mysqld]
innodb_buffer_pool_size = 4G # 根据服务器内存调整
优化查询缓存
根据业务读写比例调整query_cache_type
和query_cache_size
。
5. 慢查询日志分析
启用慢查询日志捕获执行时间超过阈值的查询,针对性优化。
# my.cnf 配置
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1 # 超过1秒的查询记录
6. 定期维护
分析和优化表
定期执行ANALYZE TABLE
更新统计信息,OPTIMIZE TABLE
回收碎片空间。
ANALYZE TABLE orders;
OPTIMIZE TABLE orders;
定期清理无用数据
归档历史数据,避免表过大影响查询性能。
7. 架构优化
- 读写分离:主库写,从库读,分担负载。
- 分库分表:水平拆分大表,解决单表数据量过大问题。
8. 监控工具
- EXPLAIN:分析查询执行计划,查看索引使用情况。
- SHOW STATUS:查看服务器状态,如
Innodb_rows_read
、Qcache_hits
。 - Percona Toolkit:一套高级 MySQL 性能分析工具。
实战案例
问题:订单表查询缓慢,数据量超 1000 万。
优化步骤:
- 为高频查询字段添加复合索引。
- 垂直拆分不常用字段到
order_extra
表。 - 开启慢查询日志,优化耗时最长的查询。
- 配置
innodb_buffer_pool_size
为 8G(服务器 16G 内存)。
结果:核心查询从 5 秒降至 0.1 秒,吞吐量提升 5 倍。
注意事项
- 避免过度索引:索引会增加写操作开销。
- 分批处理大数据:避免一次性处理大量数据导致锁表。
- 定期备份:优化前务必备份数据,防止意外。
通过以上方法,结合具体业务场景和数据库监控数据,可系统性提升 MySQL 性能。