65-MySQL其它调优策略-步骤
一、数据库调优措施
1.1、调优的目标
-
吞吐量更大
:尽可能节省系统资源
,以便系统可以提供更大负荷的服务 -
响应速度更快
:合理的结构设计
和参数调整
,以提高用户操作响应的速度
- 减少系统的瓶颈,提高MySQL数据库整体的性能
1.2、定位问题
1.2.1、用户的反馈(主要)
用户反馈
1.2.2、日志分析(主要)
通过查看
数据库日志
和操作系统日志
等方式找出异常情况,通过它们来定位遇到的问题
1.2.3、服务器资源使用监控
通过监控服务器的
CPU、内存、I/O
等使用情况,可以实时了解服务器的性能使用,与历史情况进行对比
1.2.4、数据库内部状况监控
在数据库的监控中,
活动会话(Active Session)监控
是一个重要的指标。通过它,可以清楚地了解数据库当前是否处于非常繁忙的状态,是否存在 SQL 堆积
1.2.5、其它
除了活动会话监控以外,我们也可以对
事务
、锁等待
等进行监控,这些都可以帮助我们对数据库的运行状态有更全面的认识
1.3、调优的维度和步骤
1.3.1、选择合适的 DBMS
DBMS 的选择关系到后面的整个设计过程,所以第一步就是要选择合适的 DBMS
- 如果对于
事务性处理
以及安全性要求高
的话,可以选择商业的数据库产品
如SQL Server、Oracle - NoSQL 数据库:
键值型数据库、文档型数据库、搜索引擎、列式存储、图形数据库
1.3.2、优化表设计
数据表的结构设计很基础,也很关键。好的表结构可以在业务发展和用户量增加的情况下依然发货作用,不好的表结构设计会让数据表变得非常臃肿,查询效率也会降低
- 表结构要尽量遵循
三范式
的原则。这样可以让数据结构更加清晰规范,减少冗余字段,同时也减少了更新、插入和删除数据时等异常情况的发生 - 如果
查询
应用比较多,尤其是需要进行多表联查
的时候,可以采用反范式
进行优化。反范式采用空间换时间
的方式,通过增加冗余字段提高查询的效率 -
表字段的数据类型
选择,关系到了查询效率的高低以及存储空间的大小。一般来说,如果字段可以采用数值类型
就不要采用字符类型
;字符长度要尽可能设计得短一些。针对字符类型来说,当确定字符长度固定
时,就可以采用CHAR
;当长度不固定
时,通常采用VARCHAR
类型
1.3.3、优化逻辑查询
SQL查询优化,可以分为
逻辑查询优化
和物理查询优化
。
-
逻辑查询优化
就是通过改变 SQL 语句的内容让 SQL 执行效率更高效,采用的方式是对 SQL 语句进行等价交换,对查询进行重写 - SQL 的查询重写包括了
子查询优化
、等价谓词重写
、视图重写
、条件简化
、连接消除
和嵌套连接
消除等
1.3.4、优化物理查询
物理查询优化是在确定了逻辑查询优化之后,采用物理优化技术(如索引等),通过计算
代价模型
对各种可能的访问路径进行估算,从而找到执行方式中代价最小的作为执行计划。
-
单表扫描
:对于单表扫描来说,我们可以全表扫描
所有的数据,也可以局部扫描
-
两张表的连接
:常用的连接方式包括了嵌套循环连接
、HASH连接
和合并连接
-
多张表的连接
:多张数据表进行连接的时候,顺序
很重要,因为不同的连接路径查询的效率不同,搜索空间也会不同。我们在进行多表连接
的时候,搜索空间可能会达到很高的数据级
,巨大的搜索空间显然会占用更多的资源,因为我们需要通过调整连接顺序,将搜索空间调整在一个可接受的范围内
1.3.5、使用 Redis 或 Memcached 作为缓存
通常对于查询响应要求高的场景(响应时间段、吞吐量大),可以考虑内存数据库。传统的 RDBMS 都是将数据存储在磁盘上,而内存数据库则存放在内存中,查询起来要快的多。
1.3.6、库级优先
库级优先是站在数据库的维度上进行的优化策略,如控制一个库中的数据表数量。另外,单一的数据库总会遇到各种限制,不如取长补短,利用
外援
的方式。通过主从架构
优化我们的读写策略,通过对数据库进行垂直或者水平切分,突破单一数据库或数据表的访问限制,提升查询的性能
1.3.6.1、读写分离
如果读和写的业务量都很大,并且它们都在同一个数据库服务器中进行操作,那么数据库的性能就会出现瓶颈。这时为了提升系统的性能,优化用户体验,可以采用
读写分离
的方式降低主数据的负载,如用主数据库(master)完成写操作,用从数据库(slave)完成读操作


1.3.6.2、数据分片
对
数据库分库分表
。当数据量级达到千万级以上时,有时候需要把一个数据库切成多份,放到不同的数据库服务器上,减少对单一数据库服务器的访问压力。MySQL自带了分区分表功能,也可以考虑自己做垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)
-
分拆在提升数据库性能的同时,也会增加维护成本和使用成本
image.png
image.png