大家好,欢迎来到停止重建的频道。从这个问题出发,我们来说说数据库。
这里的数据库指的是关系数据库。即表格数据库,如MySQL、Oracle等。
由于数据库是大多数业务系统的核心,我们打算分三个部分深入解释它:
1.数据库的工作原理和性能调优
2.数据库设计
3.数据库事务和分布式事务
本期我们先来讨论一下数据库的工作原理和性能调优。
数据库工作原理
首先,我们来谈谈数据库是如何工作的。数据库本身是一个独立的软件,请求者需要与数据库建立连接才能使用。与数据库的连接建立后,请求者可以发送操作指令来操作数据库。指令实际上是SQL语句,SQL语句实际上是字符串。数据库处理完SQL语句后,会将结果返回给请求端。
可以看出,请求者使用的数据库是由SQL语句实现的。所以数据库的工作原理其实就是解析SQL语句,根据它们的含义操纵数据。
数据库的工作原理与具体的数据库软件有关。这里以MySQL为例,其他数据库的工作原理也可以作为参考。MySQL有三层:服务层、存储引擎层和数据存储层。
服务层负责接收和解析SQL语句。如果是查询操作,数据库会先查询缓存。如果缓存命中,将直接返回查询结果。这里需要注意的是,虽然大多数关系数据库都支持SQL语句,但是不同的数据库,甚至是同一数据库的不同版本,在支持的SQL语句上都有一定的差异。虽然这些差距不大,但是数据库切换带来的工作量是巨大的。至少所有后端接口都需要重新测试。因此,在系统设计之初就应该设置具体的数据库软件及其版本。
存储引擎层是实际操作数据的部分,存储引擎是可以切换的。不同存储引擎的性能和功能是不同的。至少,不是所有的引擎都支持数据库事务。如果是MySQL,一般保持默认存储引擎。
存储层是数据文件,一般存储在磁盘上。因此,磁盘的读写性能也会直接影响数据库的性能。
性能调整
接下来,我们讨论数据库性能优化。这里的数据库性能优化指的是单个数据库服务器的优化。至于读写分离、碎片存储等问题,会在整体架构的系统性能优化部分详细讲解。
我们经常会遇到一个问题,即使数据库部署在16核32G服务器上,实际运行性能也不高。
如果是MySQL,我们推荐这个配置来优化服务器性能。经Sysbench工具测试,MySQL运行在4核CPU、16G内存、7200 rpm机械硬盘的服务器上。在单个表有100,000行数据的前提下,模拟1000个并发请求。
查询QPS可以达到三万以上,写QPS可以达到八千以上。
此外,数据库性能与数据量有关,尤其是在索引多、数据更新频繁的场景下。测试的时候,最好是在不同的业务场景下测试,比如单个表的10万行、100万行、500万行、1000万行数据。这样,根据业务的增长,我们可以预测未来数据库中的服务器数量何时会增加。增加服务器是为了分开读写和分片存储,以减轻单个服务器的压力。
当然,单个数据库的数据量不可能无限扩大,当账单列表超过1000万行时,MySQL的性能就会直线下降。为了保证单个数据库服务器的数据量不会太大,需要将数据分片存储。也就是多个数据库服务器一起存储所有数据,单个数据库服务器只存储其中的一部分。
关于读写分离、碎片存储等问题,一般后端代码编写不受影响,这里就不介绍了。这一部分的内容将在下面的总体架构部分讨论。
摘要
以上是数据库的工作原理和性能调优,这里介绍实际应用中的关键问题。至于更深层的数据分区,就不介绍了。如果你想知道更多,请查阅官方文件。