Mysql的性能优化方案
MySQL的性能优化主要分为以下四个方面
-
设计: 存储引擎、字段类型、范式与逆范式
-
功能: 索引、缓存、分库分表、数据库连接池
-
架构上: 读写分离、集群、均衡负载
-
合理的SQL: 测试、优化查询语句、Explain查询执行计划、慢日志
1.硬件层面的优化
从硬件层面上看,影响 mysql
的性能因素,包括 磁盘读写速度、网络带宽、内存大小
2.架构设计
MySQL
是一个磁盘IO访问
,非常频繁的关系型数据库,在高并发和高性能的场景中,MySQL
数据库必然会承受巨大的并发压力,在此时我们的优化的方式,主要可以分为几个部分:
-
搭建
MySQL
主从集群,单个MySQL
服务容易去导致单点故障,一旦服务宕机,将会导致依赖MySQL
数据库的应用,全部无法响应,主从集群或者主主集群,都可以去保证服务的高可用性。 -
读写分离设计,在读多写少的场景中,通过读写分离的方案,可以去避免读写冲突,导致的性能问题。
-
引入分库分表的机制,通过分库可以降低单个服务器一个
IO压力
。通过分表的方式,降低单表数据量,从而去提升sql的查询效率
。 -
针对热点数据,可以引入更为高效的分布式数据库,如
Redis
、MongoDB
等,他们可以很好的减轻MySQL
的访问压力,同时还能提升数据的检索性能
3. 表的设计
3.1 字段的选择
尽可能小(占用存储空间少)、尽可能定长(占用存储空间固定)、尽可能使用整数
3.2 范式与逆范式
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。
-
第一范式1NF,原子性,确保每列保持原子性,所有字段值都是不可分解的原子值
-
第二范式2NF,消除部分依赖,主键列与非主键列遵循完全函数依赖关系,确保表中的每列都和主键相关
-
第三范式3NF,消除传递依赖,非主键列之间没有传递函数依赖关系索引,确保每列都和主键列直接相关,而不是间接相关
逆范式是指打破范式,通过增加冗余或重复的数据来提高数据库的性能
3.3 拆表
垂直拆分
垂直拆分应该注意的点:
-
不经常使用的字段放在一张表上
-
经常组合查询的字段放在一张表上
-
text
等大字段拆分出来,放在一张表里
水平拆分
水平拆分时需要注意的点:
-
一般使用取模的方法进行表的拆分。也可以根据年份、地区等实际业务逻辑拆分。
-
主键应该去掉
auto_increment
的设置
3.配置优化
- MySQL 5.7版本默认的最大连接数是151个,这个值可以再my.cnf中去修改。
4.SQL的执行优化
-
慢SQL的定位和排查,我们可以通过慢查询日志和慢查询日志工具分析,得到有问题的SQL列表
-
执行计划分析,针对慢SQL我们可以使用关键字explain来去查看当前sql的执行计划,可重点关注type,key,rows,filterd等字段,从而去定位该SQL执行慢的根本原因,再去有的放矢的进行优化
-
使用show profile工具,这个工具是MySQL提供的可以用来分析当前会话中SQL语句资源消耗情况的工具,可以用于SQL调优的测量,在当前会话中,默认情况下,show profile是关闭状态,打开以后会保存,最近15次的运行结果,针对运行慢的SQL通过profile工具进行详细分析,可以得到SQL执行过程中所有资源的开销情况,比如io开销,cpu开销,内存开销
参考文献
https://blog.csdn.net/weixin_44161207/article/details/123438831