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











网友评论