Mysql的性能优化方案

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

posted @ 2022-07-17 17:33  沧海一声笑rush  阅读(1222)  评论(0编辑  收藏  举报