为您的项目选择正确的数据库是一项复杂的任务。许多数据库选项都适合不同的用例,很快就会导致决策疲劳。
我们希望这份备忘单提供高级指导,以找到符合您项目需求的正确服务并避免潜在的陷阱。
注意: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的执行非常复杂,涉及很多考虑因素,例如:
- 索引和缓存的使用
- 表连接的顺序
- 并发控制
- 事物管理