为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例,很快就会导致决策疲劳。
我们希望这份备忘单提供高级指导,以找到符合您项目需求的正确服务并避免潜在的陷阱。
注意:Google 关于其数据库用例的文档有限。尽管我们尽力查看可用的内容并得出最佳选择,但某些条目可能需要更准确。
一、国外数据库产品
二、国内数据库产品
三、数据库提供支持的 8 种数据结构
答案会根据您的用例而有所不同。数据可以在内存或磁盘上建立索引。同样,数据格式也各不相同,例如数字、字符串、地理坐标等。系统可能是写入密集型的,也可能是读取密集型的。所有这些因素都会影响您对数据库索引格式的选择。

以下是一些用于索引数据的最流行的数据结构:
- 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
 

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

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

SQL语句由数据库系统分几个步骤执行,包括:
- 解析SQL语句并检查其有效性
 - 将 SQL 转换为内部表示,例如关系代数
 - 优化内部表示并创建利用索引信息的执行计划
 - 执行计划并返回结果
 
SQL的执行非常复杂,涉及很多考虑因素,例如:
- 索引和缓存的使用
 - 表连接的顺序
 - 并发控制
 - 事物管理
 

