当前位置: 首页 > news >正文

mysql 性能优化入门

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,  -- 可优化为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_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 性能。

http://www.dtcms.com/a/286062.html

相关文章:

  • 控制鼠标和键盘
  • 完美解决Linux服务器tomcat开机自启动问题
  • Python爬虫实战:研究http-parser库相关技术
  • 操作符学习(1)
  • mysql not in 查询引发的bug问题记录
  • Microsoft 365 Adoption Score功能深度解析:驱动企业数字化转型的利器
  • 网安-DNSlog
  • 第三章自定义检视面板_创建自定义编辑器类_检测与应用修改(本章进度(2/9))
  • 可靠消息最终一致性分布式事务解决方案
  • 补贴退坡、平价上网,数字隔离器如何守护更高功率的光伏逆变器?
  • 门控线性单元GLU (Gated Linear Unit)
  • ApplicationContext 事件发布与监听机制详解
  • 反射机制的登录系统
  • PHP 8.0 升级到 PHP 8.1
  • 创建型模式
  • 基于 HT 的 3D 可视化智慧矿山开发实现
  • 从一开始的网络攻防(四):XSS
  • hadoop(服务器伪分布式搭建)
  • FastAdmin后台登录地址变更原理与手动修改方法-后台入口机制原理解析-优雅草卓伊凡
  • Hadoop安全机制深度剖析:Kerberos认证与HDFS ACL细粒度权限控制
  • 《Web安全之深度学习实战》读书笔记总结
  • AI赋能轮胎安全:基于YOLO11的智能裂纹检测系统
  • 基于springboot+vue+mysql的智慧社区设计与实现(源码+论文+开题报告)
  • Docker Swarm 集群使用记录
  • Matlab打开慢、加载慢的解决办法
  • 免费的一些工具收集
  • 【Oracle】centos7离线静默安装oracle11g(p13390677_112040)
  • Hive 向量化执行引擎 Vectorized Execution 常见 NPE 报错分析及解决
  • 全球天气预报5天(经纬度版)免费API接口教程
  • Python绘制数据(二)