Zhytou

Zhytou

May the force be with me.

11 Jun 2023

数据库概念总结

历史

个人认为想要更好的理解数据库这些年的发展变化,就要回顾历史从而体会所有变化背后的驱动因素。推荐阅读TiDB社区撰写的这篇文章,可以很好的回顾数据库的发展历史。

数据库发展历史

1996 关系数据库大火

MySQL和PostgreSQL诞生进一步促进了关系型数据库的发展,并奠定了关系型数据库的霸主地位。但与此同时,人们也提出了OLAP的概念,并指出关系型数据库并不适合这项工作,需要开发一款新数据库。

2000年,数据爆炸,NoSQL和分布式数据库出现

由于 web2.0 时代的到来,互联网用户和数据量呈几何式上升,尽管技术人员已经使用了缓存、读写分离(主从复制)、分库分表和单机数据库集群等多种手段,但传统的关系型数据库还是很难应付大型网站的超大数据量和高并发。

面对这些问题,一部分技术人员开始探索多种数据模型和存储介质的数据库,NoSQL数据库也应运而生。它扩展了诸多数据模型,在不同场景下使用不同的数据模型来进行处理。其代表成果是2009推出的文档数据库Mongdb、2010年推出的键值数据库Redis和2010年推出的图数据库Neo4j。这类NoSQL数据库极大地扩展了人们存储、使用数据的方式。

另一部分技术人员则是寄希望于用多台机器形成集群来存储、处理数据进而解决超大量数据和高并发。大量分布式数据处理系统诞生,其中又以Hadoop的子项目HBase最为出名。值得一提的是,这时期谷歌发布的三篇论文,分别是Google File System、Google Big table和Google MapReduce,为这一技术方向提供了很多理论基础。后人也称这三篇论文为奠定了分布式数据系统基础的三驾马车。

2015年,NewSQL时代

NoSQL数据库虽然解决了高并发读写、多结构化数据存储等问题,但其设计思路是牺牲事务处理、一致性以及牺牲SQL换来的。而SQL、事务的重要性让人们开始反思怎么样才能在解决前述问题的基础上保留SQL和事务的能力。Google 于2012年发布了Spanner的论文,这篇文章创新性地提出了TrueTime的概念,它在第一代 NoSQL 系统的基础之上引入了 SQL 和分布式事务,保证了强一致性。(也正是这篇论文,宣布了NoSQL时代的结束,数据库发展来到了NewSQL的阶段)

这篇文章在工业界和学术界都有着巨大的反响,截止2022年4月,对其开源实现最好的产品是于2015年诞生的CockroachDB和TiDB。和Spanner及它的追随者不同的是,Amazon在面对这一问题时,选择了完全不同的路径,Amazon 发布的Aurora 是一个存储计算分离的系统,运行在公有云之上,它的设计思想很巧妙,它把存储与计算分离使得可以非常简单得实现存储能力的可扩展。并于2017年在SIGMOD上发表了《Amazon Aurora: Design Considerations for High Throughput Cloud-NativeRelational Databases》这篇论文,披露了Aurora的一些技术实现细节。

概念

分布式数据库 vs 集中式数据库集群

分布式数据库通常由多个节点组成,每个节点都可以独立地处理数据和请求,数据可以分布在多个节点上,从而实现数据的水平分割和扩展。分布式数据库通常需要考虑数据分片、数据复制、数据一致性、故障恢复、负载均衡等问题,并且需要使用一些额外的组件或工具来管理分片,比如 MongoDB、Cassandra、HBase 等。

单机数据库集群则是将多个数据库实例部署在不同的物理节点上,通过一些技术来实现读写分离、负载均衡、故障转移等功能,从而提高系统的性能和可靠性。单机数据库集群通常需要考虑数据同步、事务处理、数据一致性等问题,并且需要使用一些额外的组件或工具来管理集群,比如 MySQL Cluster、PostgreSQL Cluster、Oracle RAC 等。

相比而言,分布式数据库通常可以实现更高的可扩展性和性能,因为数据可以在多个节点上并行处理,而且可以动态地调整节点数量和分片策略。但是,分布式数据库也可能存在数据一致性、跨分片查询、事务处理等问题,需要根据具体的应用场景和需求来选择和使用。

单机数据库集群则通常更容易管理和部署,因为所有的实例都运行在同一台机器或者在同一组机器上,而且可以使用一些标准的数据库技术和工具来管理和维护集群。但是,单机数据库集群也可能存在单点故障、性能瓶颈、资源浪费等问题,需要根据具体的应用需求和负载特点来选择和使用。

SQL vs NoSQL vs NewSQL

SQL数据库:SQL数据库,也称为关系型数据库管理系统(RDBMS),是一种用于存储和操作历史数据的传统数据库类型。在这种系统中,信息按照结构化的方式使用表格或关系进行组织。

NoSQL数据库:NoSQL数据库也称为“非关系型数据库”,它使用键值对、文档、图形数据库或宽列存储等多种数据模型,没有固定的数据模式。NoSQL数据库可以水平扩展,可以在多个服务器上进行扩展,而传统的SQL数据库则通常只能进行纵向扩展,即增加单个服务器的资源。

NewSQL数据库:NewSQL数据库是一种结合了传统SQL数据库的关系数据模型和NoSQL数据库的可扩展性和性能的新型数据库类型。它提供了两种方法的优点,可以实现高性能和水平扩展的关系型数据库。

BASE vs ACID

ACID是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)的缩写。这是一组保证数据库事务被可靠地处理的属性。

BASE是基本可用(Basically Available)、软状态(Soft state)和最终一致性(Eventual consistency)的缩写。这是一个数据一致性模型,它优先考虑可用性和分区容错性,而不是严格的一致性。

OLAP vs OLTP vs HTAP

OLAP(Online Analytical Processing)用于支持在线分析处理应用程序,如商业智能、数据挖掘、数据分析等。OLAP通常需要处理大量的数据,而且需要进行复杂的查询和分析操作。OLAP系统通常使用列式存储和向量化查询技术来提高查询性能。

OLTP(Online Transaction Processing)用于支持在线事务处理应用程序,如电子商务、金融交易、库存管理等。OLTP系统需要处理大量的事务,需要保证数据的一致性和可靠性,并且需要支持高并发的访问。

HTAP(Hybrid Transactional and Analytical Processing)是一种将OLTP和OLAP结合起来的数据处理方式。在HTAP系统中,数据可以同时用于事务处理和分析处理。HTAP系统通常使用混合存储引擎,可以在行式存储和列式存储之间灵活切换,以支持不同的应用场景。

Database vs Data Warehouse vs Data Lake

数据库存储应用程序所需的当前数据。

数据仓库存储来自一个或多个系统的当前和历史数据,并采用预定义和固定的模式,使业务分析师和数据科学家能够轻松地分析数据。

数据湖一般以数据的形式存储来自一个或多个系统的当前和历史数据,使业务分析师和数据科学家能够轻松地分析数据。

Spark vs Flink vs Hadoop

Hadoop 是一个由 Apache 开发的大数据处理框架,它包括两个核心组件:分布式文件系统 HDFS 和分布式计算框架 MapReduce。Hadoop 基于分布式文件系统和分布式计算模型,可以处理大规模的结构化和半结构化数据,支持批量处理和离线处理等场景。Hadoop 使用 HDFS 存储数据,并使用 MapReduce 进行数据处理和计算。

Spark 是一个由 Apache 开发的大数据处理框架,它基于内存计算和分布式计算模型,可以处理大规模的结构化和半结构化数据,支持批量处理、流处理和机器学习等场景。Spark 支持使用多种编程语言进行开发,例如 Scala、Java、Python 和 R 等,提供了丰富的 API 和库,以支持各种数据处理和分析操作。

Flink 是一个由 Apache 开发的大数据处理框架,它基于流处理和批处理的统一计算模型,可以处理大规模的结构化和半结构化数据,支持实时处理、流式处理和批量处理等场景。Flink 支持使用多种编程语言进行开发,例如 Java、Scala 和 Python 等,提供了丰富的 API 和库,以支持各种数据处理和分析操作。

分类

db_classification

我们可以按照数据库的存储模型将其分类,常见类型如下:

关系型数据库:关系型数据库是使用表格来存储数据的,其中每个表格包含多个行和列,每列代表一个属性。关系型数据库使用 SQL(Structured Query Language)来进行数据查询和操作,支持事务处理和 ACID 原则。常见的关系型数据库有 MySQL、Oracle、SQL Server 等。

键值数据库:键值数据库是一种类型简单的 NoSQL 数据库,数据以键值对的形式存储,其中键是唯一的标识符,值可以是任何类型的数据。键值数据库通常用于存储非结构化的数据,例如缓存、会话管理等场景。常见的键值数据库有 Redis、Memcached 等。

文档数据库:文档数据库是一种 NoSQL 数据库,数据以文档(Document)的形式存储,文档可以是 JSON、XML 等格式。文档数据库通常用于存储半结构化和非结构化的数据,例如 Web 应用程序、内容管理系统等场景。常见的文档数据库有 MongoDB、Couchbase 等。

时序数据库:时序数据库是一种专门用于存储和查询时间序列数据的数据库,例如传感器数据、网络日志等。时序数据库的特点是高效地存储和查询大量的时间序列数据。常见的时序数据库有 InfluxDB、OpenTSDB 等。

图数据库:图数据库是一种 NoSQL 数据库,数据以图的形式存储,其中节点表示实体,边表示实体之间的关系。图数据库通常用于存储和查询复杂的实体关系,例如社交网络、知识图谱等场景。常见的图数据库有 Neo4j、OrientDB 等。

另一方面,我们还可以将其按照功能分类,比如OLAP、OLTP和HTAP三种。一般来说,数据库的功能和特性能够和其存储模型对应,例如:关系型数据库往往是OLTP数据库。

但由于一些复杂的应用场景,人们又推出了一些多模型数据库,例如:将SQL和NoSQL结合的NewSQL数据库,就能在保持数据强一致性的同时,通过水平扩展获得一定的高可用性,比如国内大火的TiDB。

除此之外,时序数据库常常用于和消息存储队列+流处理框架()的解决方案(也有厂商将其包装成数据库,称为流数据库,例如:Confluent的ksqldb)对比;流数据处理和OLAP的对比,可以阅读这篇文章

架构

外部

我们可以根据数据库节点部署整体架构分为几大种类:

单机

计算节点和存储节点一般在同一台机器上,通常存储节点是本地硬盘,如单机版的MySQL、Oracle。单机模式没有高可用保障,常用于临时开发测试或者个人学习场景,生产环境不建议使用。

分组

主从

一个主数据库负责所有写操作和一部分读操作,而其他一个或多个从数据库则通过复制主数据库的数据来提供读操作。

主备

一个主数据库负责处理所有写操作和一部分读操作,而集群中一个备用数据库则通过复制数据库(不提供读操作)来保证主数据库挂之后的可用性。

主主

多个数据库都可以处理写操作,而其他数据库则通过复制彼此的数据来提供读操作。

分片

分片是将数据库中的数据分为多个片段或分片,每个分片可以单独存储在不同的服务器上。这种技术被广泛应用于分布式数据库中,以提高系统的可扩展性和性能。

内部

存储引擎

HEAP:

HEAP存储引擎是一种基于内存的存储引擎,它将数据存储在内存中而不是磁盘上,因此具有快速的读写速度。使用HEAP存储引擎的表不具有任何索引或约束,因此适用于临时存储数据或缓存数据。

B+ TREE:

B+ TREE存储引擎是一种基于磁盘的存储引擎,它将数据存储在磁盘上,支持高效的查找、插入和删除操作。B+ TREE存储引擎通常用于管理关系型数据库中的索引数据。

COLUMN STORE:

COLUMN STORE存储引擎是一种基于列的存储引擎,它将表中的每个列存储在独立的列簇中,以提高查询性能和压缩比率。COLUMN STORE存储引擎通常用于处理大型数据集和分析查询。

LSM-TREE:

LSM-TREE存储引擎是一种基于磁盘的存储引擎,它将数据存储在内存中的多个层次结构和磁盘上,以提高写入性能和查询性能。LSM-TREE存储引擎通常用于处理大量写入操作和高吞吐量的查询操作,例如日志记录和分析系统。

存储引擎比较

查询引擎

查询引擎比较

设计

索引

概述

索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构。

分类

  • B-Tree索引:查找、排序和分组
  • Hash索引:只能查找,且无法范围查找

失效

  • 查询条件中有or
  • like查询是以'%‘开头
  • 对查询的列上有运算或者函数的
  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  • 左连接查询或者右连接查询查询关联的字段编码格式不一样

优化

用explain 命令查看执行计划,然后针对性的修改sql语句。

范式

规范化(Normalization)是指将关系型数据库设计成符合特定范式的过程。通过规范化,可以消除冗余数据,提高数据的一致性和可维护性。

目前常见的范式包括1NF、2NF、3NF和BCNF范式。

参考