为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例,很快就会导致决策疲劳。

我们希望这份备忘单提供高级指导,以找到符合您项目需求的正确服务并避免潜在的陷阱。

注意:Google 关于其数据库用例的文档有限。尽管我们尽力查看可用的内容并得出最佳选择,但某些条目可能需要更准确。

一、国外数据库产品

系统设计之数据库-LMLPHP

 二、国内数据库产品

系统设计之数据库-LMLPHP

三、数据库提供支持的 8 种数据结构

答案会根据您的用例而有所不同。数据可以在内存或磁盘上建立索引。同样,数据格式也各不相同,例如数字、字符串、地理坐标等。系统可能是写入密集型的,也可能是读取密集型的。所有这些因素都会影响您对数据库索引格式的选择。

系统设计之数据库-LMLPHP

以下是一些用于索引数据的最流行的数据结构:

  • Skiplist:常见的内存索引类型。用于Redis
  • 哈希索引:“Map”数据结构(或“Collection”)的一种非常常见的实现
  • SSTable:不可变的磁盘“Map”实现
  • LSM树:Skiplist + SSTable。高写入吞吐量
  • B 树:基于磁盘的解决方案。一致的读/写性能
  • 倒排索引:用于文档索引。在Lucene中使用
  • 后缀树:用于字符串模式搜索
  • R-tree:多维搜索,比如寻找最近邻居

四、SQL 语言组件

  • DDL:数据定义语言,如CREATE、ALTER、DROP
  • DQL:数据查询语言,如SELECT
  • DML:数据操作语言,如INSERT、UPDATE、DELETE
  • DCL:数据控制语言,如GRANT、REVOKE
  • TCL:事务控制语言,如COMMIT、ROLLBACK

系统设计之数据库-LMLPHP

下图显示了该过程。请注意,不同数据库的架构有所不同,该图演示了一些常见的设计。

系统设计之数据库-LMLPHP

通过传输层协议(例如TCP)将SQL 语句发送到数据库。

  1. SQL 语句被发送到命令解析器,在其中进行语法和语义分析,然后生成查询树。
  2. 查询树被发送到优化器。优化器创建执行计划。
  3. 将执行计划发送给执行者。执行器从执行中检索数据。
  4. 访问方法提供执行所需的数据获取逻辑,从存储引擎检索数据。
  5. 访问方法决定 SQL 语句是否是只读的。如果查询是只读的(SELECT 语句),则会将其传递到缓冲区管理器以进行进一步处理。缓冲区管理器在缓存或数据文件中查找数据。
  6.  如果语句是 UPDATE 或 INSERT,则将其传递到事务管理器以进行进一步处理。
  7.  在事务期间,数据处于锁定模式。这是由锁管理器保证的。它还确保了事务的 ACID 属性。

五、SQL查询可视化

系统设计之数据库-LMLPHP

SQL语句由数据库系统分几个步骤执行,包括:

  • 解析SQL语句并检查其有效性
  • 将 SQL 转换为内部表示,例如关系代数
  • 优化内部表示并创建利用索引信息的执行计划
  • 执行计划并返回结果

SQL的执行非常复杂,涉及很多考虑因素,例如:

  • 索引和缓存的使用
  • 表连接的顺序
  • 并发控制
  • 事物管理
12-08 00:52