mysql 性能优化入门

发布于:2025-07-20 ⋅ 阅读:(13) ⋅ 点赞:(0)

MySQL 性能优化是一个复杂的过程,涉及数据库设计、查询优化、索引优化、配置调整等多个方面。以下是一些实战技巧和建议:

1. 查询优化

避免全表扫描

确保查询条件(WHEREJOIN)字段上有索引,避免全表扫描。

-- 优化前(可能全表扫描)
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,  -- 可优化为TINYINT
  username 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_typequery_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_readQcache_hits
  • Percona Toolkit:一套高级 MySQL 性能分析工具。

实战案例

问题:订单表查询缓慢,数据量超 1000 万。
优化步骤

  1. 为高频查询字段添加复合索引。
  2. 垂直拆分不常用字段到order_extra表。
  3. 开启慢查询日志,优化耗时最长的查询。
  4. 配置innodb_buffer_pool_size为 8G(服务器 16G 内存)。

结果:核心查询从 5 秒降至 0.1 秒,吞吐量提升 5 倍。

注意事项

  • 避免过度索引:索引会增加写操作开销。
  • 分批处理大数据:避免一次性处理大量数据导致锁表。
  • 定期备份:优化前务必备份数据,防止意外。

通过以上方法,结合具体业务场景和数据库监控数据,可系统性提升 MySQL 性能。


网站公告

今日签到

点亮在社区的每一天
去签到