SQL进阶理论篇(一):数据库的调优

文章目录

  • 简介
  • 数据库调优的目标
  • 可供选择的维度
  • 参考文献

简介

本节主要分为以下三方面内容:

  • 数据库调优的目标是什么?
  • 如果要进行调优,都有哪些维度可以选择?
  • 如何思考和分析数据库调优?

只是简单介绍了一些基础理论,之后有时间的话再针对性扩展吧。

数据库调优的目标

简单来说,就是让相应的时间更快,吞吐量更大。

那怎么断定我这次调优是有效的呢?

可以根据用户的反馈,或者服务器资源的使用监控、数据库内部的会话监控等。

可供选择的维度

  • 选择合适的DBMS

比如说OLTP,追求实时性,那么使用基于行存的RDBMS更好。对于OLAP,对实时性要求不高,那么出于存储的角度,可以考虑列式的DBMS。

  • 优化表设计

比如说视情况,是遵循第三范式的原则,减少冗余字段?还是采取反范式,以空间换时间,通过增加冗余字段来避免多表联查的开销。

  • 优化逻辑查询

比如说索引的应用,在字段已有索引的前提下,注意避免让索引失效。

  • 优化物理查询

比如说,如何更好的创建索引。

在数据重复度高的情况下,可以选择不创建索引,如性别这个字段。

另外,索引不是越多越好。每个索引都需要存储空间,索引多就意味着更多的存储空间。而且,过多的索引也会导致优化器在进行评估的时候增加了一项筛选出索引的时间,从而影响效率。

联合索引在声明时,字段顺序也是有很大影响的。比如我们对字段x、y和z创建联合索引,那创建的时候是按照(x,y,z)还是(z,y,x),理论上在使用的时候是会有差别的。

  • 使用Redis或者Memcached作为缓存

这个属于寻求外援的支持,来提升查询的效率。

因为数据都是存放到数据库中,我们需要从数据库层中取出数据放到内存中进行业务逻辑的操作,当用户量增大的时候,如果频繁地进行数据查询,会消耗数据库的很多资源。

如果我们将常用的数据直接放到内存中,就会大幅提升查询的效率。键值存储数据库可以帮我们解决这个问题。

常用的键值存储数据库有 Redis 和 Memcached,它们都可以将数据存放到内存中。

从可靠性来说,Redis 支持持久化,可以让我们的数据保存在硬盘上,不过这样一来性能消耗也会比较大。而 Memcached 仅仅是内存存储,不支持持久化。

另外,Redis支持的数据类型也更多。

  • 库级优化

使用主从架构优化来进行读写分离。比如用主数据库(master)来完成写操作,用从数据库(slave)完成读操作。从而降低主数据库的负载。

还可以对数据库进行分库分表。就是把一个数据库或者一个数据表切成多份,可以放到不同的数据库服务器上,减少对单一数据库服务器的访问压力。

如果你使用的是 MySQL,就可以使用 MySQL 自带的分区表功能,当然你也可以考虑自己做垂直切分和水平切分。

如果一个数据库中的数据表过多,可以采用垂直分库的方式,将表放到不同的数据库服务器上,把会发生关联的数据表都部署在同一个数据库上。

如果一个数据表中的列太多,可以采用垂直分表的方式,将一个数据表切成多张,经常在一起使用的列放在同一张表中。

如果一个数据表中的行太多,可以采用水平分表的方式,将一个数据表切分成不同的子表,每张表的表结构保持一致。比如说按年份做水平分表,2017年、2018年和2019年的数据分别放在三个不同的数据表中。

参考文献

  1. 20丨当我们思考数据库调优的时候,都有哪些维度可以选择?

你可能感兴趣的:(#,SQL基础,数据库,sql,database)