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

MySQL查询优化100条军规

概述

  • 以下是MySQL查询优化的关键军规,分为不同类别,帮助您系统化提升数据库性能
  • 资料已经分类整理好,喜欢的朋友自取:https://pan.quark.cn/s/f52968c518d3

一、索引优化

  1. 为WHERE、JOIN、ORDER BY字段建索引
  2. 联合索引遵循最左前缀原则
  3. 避免在索引列使用函数或计算
  4. 高选择性列适合建索引(区分度>80%)
  5. 控制单表索引数量(建议≤5个)
  6. 避免重复索引(如已有(a,b)再单独建a)
  7. 长字符串使用前缀索引(前N个字符)
  8. 排序ORDER BY字段尽量使用索引
  9. 覆盖索引避免回表查询
  10. 定期分析索引使用率(SHOW INDEXES)
  11. 删除冗余/未使用的索引
  12. 外键字段必须建索引
  13. 避免在索引列使用NOT、<>、!=操作
  14. 使用索引条件下推(ICP)特性
  15. 范围查询后的列无法使用索引

二、查询语句优化

  1. 避免SELECT *,明确指定字段
  2. 用JOIN代替子查询(WHERE IN)
  3. 避免使用%前缀的LIKE查询
  4. 分页查询优化(避免OFFSET过大)
  5. 用UNION ALL代替UNION去重
  6. 批量INSERT使用多值语法
  7. 避免在WHERE子句进行类型转换
  8. 使用EXISTS代替COUNT(*)判断存在性
  9. 用BETWEEN代替多个OR条件
  10. 优先使用INNER JOIN而非OUTER JOIN
  11. LIMIT分页结合WHERE id > N
  12. 避免在WHERE子句使用OR连接条件
  13. 使用强制索引时需谨慎(FORCE INDEX)
  14. 拆分复杂查询为多个简单查询
  15. 避免在WHERE子句使用数学运算
  16. 使用预编译语句(Prepared Statements)
  17. 避免在循环中执行查询
  18. 处理NULL值要谨慎(IS NULL无法用索引)
  19. 使用下推条件优化子查询
  20. 合并多个相同条件的查询请求

三、表结构优化

  1. 优先选择整型而非字符串类型
  2. 字段定义为NOT NULL并设置默认值
  3. 用ENUM代替字符串类型
  4. 大表拆分:水平分表/垂直分表
  5. 控制单表数据量(建议≤500万行)
  6. 使用合适的数据类型(如TIMESTAMP代替DATETIME)
  7. 避免使用TEXT/BLOB存储频繁查询的数据
  8. 归档历史数据(分区表或独立存储)
  9. 表字段注释和索引注释要完整
  10. 主键建议使用自增整型(AUTO_INCREMENT)
  11. 避免过度范式化设计(适当冗余)
  12. 使用生成列(Generated Columns)优化查询
  13. 删除无用字段和废弃表
  14. 大字段单独存储到扩展表
  15. 使用CHAR固定长度存储短字符串

四、配置优化

  1. 合理设置innodb_buffer_pool_size(70-80%内存)
  2. 调整query_cache_size(8.0+版本已移除)
  3. 优化max_connections连接数
  4. 设置合适的innodb_flush_log_at_trx_commit
  5. 关闭性能模式非必要功能
  6. 启用慢查询日志(slow_query_log)
  7. 设置合理的tmp_table_size
  8. 调整thread_cache_size减少连接开销
  9. 使用SSD存储提升IO性能
  10. 定期更新统计信息(ANALYZE TABLE)

五、事务与锁优化

  1. 避免长事务(减少锁持有时间)
  2. 使用SELECT … FOR UPDATE要谨慎
  3. 合理选择事务隔离级别
  4. 批量操作分批次提交
  5. 监控锁等待(SHOW ENGINE INNODB STATUS)
  6. 避免间隙锁导致死锁
  7. 优先使用乐观锁机制
  8. 及时提交或回滚未完成事务
  9. 大表DDL操作使用pt-online-schema-change
  10. 使用SELECT … LOCK IN SHARE MODE需谨慎

六、高级技巧

  1. 使用EXPLAIN分析执行计划
  2. 启用查询重写插件(query_rewrite)
  3. 利用窗口函数减少多次查询
  4. 使用CTE(公用表表达式)优化复杂查询
  5. 配置读写分离架构
  6. 使用连接池管理数据库连接
  7. 热点数据使用Redis缓存
  8. 定期执行OPTIMIZE TABLE重组表
  9. 使用SQL_NO_CACHE测试真实性能
  10. 监控InnoDB行锁竞争情况

七、设计规范

  1. 所有表必须包含主键
  2. 禁止使用触发器/存储过程实现核心逻辑
  3. 统一字符集为utf8mb4
  4. 时间字段统一使用UTC时间
  5. 数据删除使用软删除标记
  6. 建立数据归档机制
  7. 禁止开发环境直连生产库
  8. 重要操作记录审计日志
  9. 建立数据库字段变更流程
  10. 定期进行数据库健康检查

八、工具使用

  1. 使用pt-query-digest分析慢查询
  2. 配置Prometheus+Granafa监控
  3. 使用Percona Toolkit进行优化
  4. 使用mysqldumpslow分析日志
  5. 利用Performance Schema监控性能
  6. 使用SHOW PROFILE分析查询细节
  7. 配置自动化的备份恢复机制
  8. 使用EXPLAIN FORMAT=JSON获取详细信息
  9. 使用mysqlslap进行压力测试
  10. 定期执行CHECK TABLE检查表完整性

注意事项

  1. 所有优化需结合业务场景
  2. 修改前务必进行备份
  3. 优先优化高频率的查询
  4. 基准测试验证优化效果
  5. 监控优化后的长期稳定性
http://www.xdnf.cn/news/405703.html

相关文章:

  • 深度解析RagFlow:本地大模型驱动的高效知识库应用搭建指南
  • Java MVC
  • nRF5_SDK_17.1.0_ddde560之ble_app_uart_c 出错
  • [Java实战]Spring Boot 整合 Session 共享(十七)
  • LintCode第42题-最大子数组 II
  • 《Vuejs设计与实现》第 5 章(非原始值响应式方案) 中
  • OpenCV 的 CUDA 模块中用于将一个多通道 GpuMat 图像拆分成多个单通道图像的函数split()
  • 【AI News | 20250512】每日AI进展
  • 一键生成达梦、Oracle、MySQL 数据库 ER 图!解锁高效数据库设计!
  • 【LeetCode】49.字母异位词分组
  • 典籍知识问答重新生成和消息修改Bug修改
  • 从零搭建AI工作站:Gemma3大模型本地部署+WebUI配置全套方案
  • sqlmap使用入门
  • Linux 系统中设置开机启动脚本
  • AAAI-2025 | 中科院无人机导航新突破!FELA:基于细粒度对齐的无人机视觉对话导航
  • 【JAVA】业务系统订单号,流水号生成规则工具类
  • python练习-20250512
  • C++23 views::slide (P2442R1) 深入解析
  • AnaTraf:深度解析网络性能分析(NPM)
  • C语言:深入理解指针(3)
  • 基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考
  • T2000云腾边缘计算盒子在数猪场景中的应用|YOLOv8+NodeRED
  • 湖北理元理律师事务所:企业债务危机的“止血”与“造血”平衡术
  • 01背包和完全背包
  • 基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Tools
  • 大项目k8s集群有多大规模,多少节点,有多少pod
  • 智能指针入门:深入理解 C++ 的 shared_ptr
  • AI中的MCP是什么?MCP的作用及未来方向预测 (使用go-zero 快速搭建MCP服务器)
  • 2025年北京市积分落户申报
  • 经典案例 | 智能眼镜中瞳距调节和近视调节的应用