MySQL的性能优化主要分为以下四个方面

  • 设计: 存储引擎、字段类型、范式与逆范式

  • 功能: 索引、缓存、分库分表、数据库连接池

  • 架构上: 读写分离、集群、均衡负载

  • 合理的SQL: 测试、优化查询语句、Explain查询执行计划、慢日志

1.硬件层面的优化

从硬件层面上看,影响 mysql 的性能因素,包括 磁盘读写速度网络带宽内存大小

2.架构设计

MySQL 是一个磁盘IO访问,非常频繁的关系型数据库,在高并发和高性能的场景中,MySQL数据库必然会承受巨大的并发压力,在此时我们的优化的方式,主要可以分为几个部分:

  1. 搭建MySQL主从集群,单个MySQL服务容易去导致单点故障,一旦服务宕机,将会导致依赖MySQL数据库的应用,全部无法响应,主从集群或者主主集群,都可以去保证服务的高可用性。

  2. 读写分离设计,在读多写少的场景中,通过读写分离的方案,可以去避免读写冲突,导致的性能问题。

  3. 引入分库分表的机制,通过分库可以降低单个服务器一个IO压力。通过分表的方式,降低单表数据量,从而去提升sql的查询效率

  4. 针对热点数据,可以引入更为高效的分布式数据库,如RedisMongoDB等,他们可以很好的减轻MySQL的访问压力,同时还能提升数据的检索性能

3. 表的设计

3.1 字段的选择

尽可能小(占用存储空间少)、尽可能定长(占用存储空间固定)、尽可能使用整数

3.2 范式与逆范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。

  • 第一范式1NF,原子性,确保每列保持原子性,所有字段值都是不可分解的原子值

  • 第二范式2NF,消除部分依赖,主键列与非主键列遵循完全函数依赖关系,确保表中的每列都和主键相关

  • 第三范式3NF,消除传递依赖,非主键列之间没有传递函数依赖关系索引,确保每列都和主键列直接相关,而不是间接相关

逆范式是指打破范式,通过增加冗余或重复的数据来提高数据库的性能

3.3 拆表

垂直拆分



垂直拆分应该注意的点:

  • 不经常使用的字段放在一张表上

  • 经常组合查询的字段放在一张表上

  • text等大字段拆分出来,放在一张表里

水平拆分



水平拆分时需要注意的点:

  • 一般使用取模的方法进行表的拆分。也可以根据年份、地区等实际业务逻辑拆分。

  • 主键应该去掉 auto_increment 的设置

3.配置优化

  • MySQL 5.7版本默认的最大连接数是151个,这个值可以再my.cnf中去修改。

4.SQL的执行优化

  1. 慢SQL的定位和排查,我们可以通过慢查询日志和慢查询日志工具分析,得到有问题的SQL列表

  2. 执行计划分析,针对慢SQL我们可以使用关键字explain来去查看当前sql的执行计划,可重点关注type,key,rows,filterd等字段,从而去定位该SQL执行慢的根本原因,再去有的放矢的进行优化

  3. 使用show profile工具,这个工具是MySQL提供的可以用来分析当前会话中SQL语句资源消耗情况的工具,可以用于SQL调优的测量,在当前会话中,默认情况下,show profile是关闭状态,打开以后会保存,最近15次的运行结果,针对运行慢的SQL通过profile工具进行详细分析,可以得到SQL执行过程中所有资源的开销情况,比如io开销,cpu开销,内存开销

参考文献

https://blog.csdn.net/weixin_44161207/article/details/123438831

最新文章

  1. 使用 Code Snippet 简化 Coding
  2. Javascript学习笔记:闭包题解(2)
  3. AngularJS的学习--ng-show/ng-hide/ng-if和ng-switch
  4. xml中数据存储 <![CDATA[ … ]]>
  5. WSARecv()
  6. 启动任务StartTask() 发送完消息队列 自己删除,接收方一直显示数据 用OSQFlush(Str_Q); //清空消息队列 下面纠结接收不到了 哈哈
  7. yum cannot retrieve metalink for repository
  8. Selenium元素定位之Xpath
  9. 时区,GMT时间,UTC时间,UNIX时间戳
  10. Dynamics 365—脚本
  11. Use the Microsoft Symbol for VS and Windbg
  12. Nginx——location匹配与在配置中的优先级
  13. python学习Day3 变量、格式化输出、注释、基本数据类型、运算符
  14. faster rcnn源码阅读笔记2
  15. C++中类的静态成员与实例成员的区别
  16. java 线程状态相关测试
  17. bootstrap日历控件
  18. python使用pwd和grp操作unix用户及用户组
  19. Python--进阶处理3
  20. WinAPI: GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId

热门文章

  1. 跳板攻击之:frp代理转发
  2. echart折线图异常多出一条连接线
  3. git 合并dev分支到 master分支 (merge)
  4. Solon2 的应用生命周期
  5. LeetCode-622 设计循环队列
  6. E-MU1212m(E-MU1616m)在Win10(Win11)中的驱动安装
  7. uniapp 实现APP强更新,热更新
  8. 关于浏览器缓存造成的bug解决方法(页面跳转缓存,刷新生效)
  9. b站m4s视频混流
  10. canvas实现屏幕截图