Skip to content

Commit

Permalink
feat: 整理图片
Browse files Browse the repository at this point in the history
  • Loading branch information
dunwu committed Jan 27, 2024
1 parent 6c3031b commit a1d04b3
Show file tree
Hide file tree
Showing 45 changed files with 169 additions and 169 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<p align="center">
<a href="https://dunwu.github.io/db-tutorial/" target="_blank" rel="noopener noreferrer">
<img src="https://raw.githubusercontent.com/dunwu/images/dev/common/dunwu-logo.png" alt="logo" width="150px"/>
<img src="https://raw.githubusercontent.com/dunwu/images/master/common/dunwu-logo.png" alt="logo" width="150px"/>
</a>
</p>

Expand Down Expand Up @@ -85,7 +85,7 @@

### Mysql

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200716103611.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200716103611.png)

- [Mysql 应用指南](docs/12.数据库/03.关系型数据库/02.Mysql/01.Mysql应用指南.md)
- [Mysql 工作流](docs/12.数据库/03.关系型数据库/02.Mysql/02.MySQL工作流.md) - 关键词:`连接``缓存``语法分析``优化``执行引擎``redo log``bin log``两阶段提交`
Expand Down Expand Up @@ -128,7 +128,7 @@

### Redis

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200713105627.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200713105627.png)

- [Redis 面试总结](docs/12.数据库/05.KV数据库/01.Redis/01.Redis面试总结.md) 💯
- [Redis 应用指南](docs/12.数据库/05.KV数据库/01.Redis/02.Redis应用指南.md) ⚡ - 关键词:`内存淘汰``事件``事务``管道``发布与订阅`
Expand Down
2 changes: 1 addition & 1 deletion docs/.vuepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ module.exports = {
}
],
sidebarDepth: 2, // 侧边栏显示深度,默认1,最大2(显示到h3标题)
logo: 'https://raw.githubusercontent.com/dunwu/images/dev/common/dunwu-logo.png', // 导航栏logo
logo: 'https://raw.githubusercontent.com/dunwu/images/master/common/dunwu-logo.png', // 导航栏logo
repo: 'dunwu/db-tutorial', // 导航栏右侧生成Github链接
searchMaxSuggestions: 10, // 搜索结果显示最大数
lastUpdated: '上次更新', // 更新的时间,及前缀文字 string | boolean (取值为git提交时间)
Expand Down
36 changes: 18 additions & 18 deletions docs/12.数据库/01.数据库综合/01.Nosql技术选型.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ permalink: /pages/0e1012/

# Nosql 技术选型

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209020702.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209020702.png)

## 一、Nosql 简介

Expand All @@ -27,7 +27,7 @@ permalink: /pages/0e1012/

随着大数据时代的到来,越来越多的网站、应用系统需要支撑海量数据存储,高并发请求、高可用、高可扩展性等特性要求。传统的关系型数据库在应付这些调整已经显得力不从心,暴露了许多能以克服的问题。由此,各种各样的 NoSQL(Not Only SQL)数据库作为传统关系型数据的一个有力补充得到迅猛发展。

![nosql-history](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209005228.png)
![nosql-history](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209005228.png)

**NoSQL,泛指非关系型的数据库**,可以理解为 SQL 的一个有力补充。

Expand Down Expand Up @@ -56,7 +56,7 @@ permalink: /pages/0e1012/

将表放入存储系统中有两种方法,而我们绝大部分是采用行存储的。 行存储法是将各行放入连续的物理位置,这很像传统的记录和文件系统。 列存储法是将数据按照列存储到数据库中,与行存储类似,下图是两种存储方法的图形化解释:

![按行存储和按列存储模式](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209005316.png)
![按行存储和按列存储模式](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209005316.png)

### 列式数据库产品

Expand All @@ -80,13 +80,13 @@ permalink: /pages/0e1012/

列式数据库由于其针对不同列的数据特征而发明的不同算法,使其**往往有比行式数据库高的多的压缩率**,普通的行式数据库一般压缩率在 3:1 到 5:1 左右,而列式数据库的压缩率一般在 8:1 到 30:1 左右。 比较常见的,通过字典表压缩数据: 下面中才是那张表本来的样子。经过字典表进行数据压缩后,表中的字符串才都变成数字了。正因为每个字符串在字典表里只出现一次了,所以达到了压缩的目的(有点像规范化和非规范化 Normalize 和 Denomalize)

![通过字典表压缩数据](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209005406.png)
![通过字典表压缩数据](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209005406.png)

- **查询效率高**

读取多条数据的同一列效率高,因为这些列都是存储在一起的,一次磁盘操作可以数据的指定列全部读取到内存中。 下图通过一条查询的执行过程说明列式存储(以及数据压缩)的优点

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209005611.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209005611.png)

```
执行步骤如下:
Expand Down Expand Up @@ -127,19 +127,19 @@ KV 存储非常适合存储**不涉及过多数据关系业务关系的数据**

- Redis

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209010410.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209010410.png)

Redis 是一个使用 ANSI C 编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。从 2015 年 6 月开始,Redis 的开发由 Redis Labs 赞助,而 2013 年 5 月至 2015 年 6 月期间,其开发由 Pivotal 赞助。在 2013 年 5 月之前,其开发由 VMware 赞助。根据月度排行网站 DB-Engines.com 的数据显示,Redis 是最流行的键值对存储数据库。

- Cassandra

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209010451.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209010451.png)

Apache Cassandra(社区内一般简称为 C\*)是一套开源分布式 NoSQL 数据库系统。它最初由 Facebook 开发,用于储存收件箱等简单格式数据,集 Google BigTable 的数据模型与 Amazon Dynamo 的完全分布式架构于一身。Facebook 于 2008 将 Cassandra 开源,此后,由于 Cassandra 良好的可扩展性和性能,被 Apple, Comcast,Instagram, Spotify, eBay, Rackspace, Netflix 等知名网站所采用,成为了一种流行的分布式结构化数据存储方案。

- LevelDB

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209011140.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209011140.png)

LevelDB 是一个由 Google 公司所研发的键/值对(Key/Value Pair)嵌入式数据库管理系统编程库, 以开源的 BSD 许可证发布。

Expand Down Expand Up @@ -176,13 +176,13 @@ KV 存储非常适合存储**不涉及过多数据关系业务关系的数据**

- MongoDB

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209012320.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209012320.png)

**MongoDB**是一种面向文档的数据库管理系统,由 C++ 撰写而成,以此来解决应用程序开发社区中的大量现实问题。2007 年 10 月,MongoDB 由 10gen 团队所发展。2009 年 2 月首度推出。

- CouchDB

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209012418.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209012418.png)

Apache CouchDB 是一个开源数据库,专注于易用性和成为"**完全拥抱 web 的数据库**"。它是一个使用 JSON 作为存储格式,JavaScript 作为查询语言,MapReduce 和 HTTP 作为 API 的 NoSQL 数据库。其中一个显著的功能就是多主复制。CouchDB 的第一个版本发布在 2005 年,在 2008 年成为了 Apache 的项目。

Expand Down Expand Up @@ -234,11 +234,11 @@ MongonDB 还是支持多文档事务的 Consistency(一致性)和 Durability(持

现在有如下文档集合:

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209014530.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209014530.png)

正排索引得到索引如下:

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209014723.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209014723.png)

可见,正排索引适用于根据文档名称查询文档内容

Expand All @@ -248,7 +248,7 @@ MongonDB 还是支持多文档事务的 Consistency(一致性)和 Durability(持

带有单词频率信息的倒排索引如下:

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209014842.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209014842.png)

可见,倒排索引适用于根据关键词来查询文档内容

Expand All @@ -262,7 +262,7 @@ MongonDB 还是支持多文档事务的 Consistency(一致性)和 Durability(持

- Solr

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209014947.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209014947.png)

Solr 是 Apache Lucene 项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本(如 Word、PDF)的处理。Solr 是高度可扩展的,并提供了分布式搜索和索引复制

Expand Down Expand Up @@ -296,27 +296,27 @@ MongonDB 还是支持多文档事务的 Consistency(一致性)和 Durability(持

## 六、图数据库

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209015751.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209015751.png)

**图形数据库应用图论存储实体之间的关系信息**。最常见例子就是社会网络中人与人之间的关系。关系型数据库用于存储“关系型”数据的效果并不好,其查询复杂、缓慢、超出预期,而图形数据库的独特设计恰恰弥补了这个缺陷,解决关系型数据库存储和处理复杂关系型数据功能较弱的问题。

### 图数据库产品

- Neo4j

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209015817.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209015817.png)

Neo4j 是由 Neo4j,Inc。开发的图形数据库管理系统。由其开发人员描述为具有原生图存储和处理的符合 ACID 的事务数据库,根据 DB-Engines 排名, Neo4j 是最流行的图形数据库。

- ArangoDB

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209015858.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209015858.png)

ArangoDB 是由 triAGENS GmbH 开发的原生多模型数据库系统。数据库系统支持三个重要的数据模型(键/值,文档,图形),其中包含一个数据库核心和统一查询语言 AQL(ArangoDB 查询语言)。查询语言是声明性的,允许在单个查询中组合不同的数据访问模式。ArangoDB 是一个 NoSQL 数据库系统,但 AQL 在很多方面与 SQL 类似。

- Titan

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200209015923.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200209015923.png)

Titan 是一个可扩展的图形数据库,针对存储和查询包含分布在多机群集中的数百亿个顶点和边缘的图形进行了优化。Titan 是一个事务性数据库,可以支持数千个并发用户实时执行复杂的图形遍历。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,21 +41,21 @@ permalink: /pages/d7cd88/

在有序数组上应用二分查找法如此高效,为什么几乎没有数据库直接使用数组作为索引?这是因为它的限制条件:**数据有序**——为了保证数据有序,每次添加、删除数组数据时,都必须要进行数据调整,来保证其有序,而 **数组的插入/删除操作,时间复杂度为 `O(n)`**。此外,由于数组空间大小固定,每次扩容只能采用复制数组的方式。数组的这些特性,决定了它不适合用于数据频繁变化的应用场景。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20220320115836.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220320115836.png)

**链表用不连续的内存空间来存储数据;并通过一个指针按顺序将这些空间串起来,形成一条链**

区别于数组,链表中的元素不是存储在内存中连续的一片区域,链表中的数据存储在每一个称之为「结点」复合区域里,在每一个结点除了存储数据以外,还保存了到下一个节点的指针(Pointer)。由于不必按顺序存储,**链表的插入/删除操作,时间复杂度为 `O(1)`**,但是,链表只支持顺序访问,其 **查找时间复杂度为 `O(n)`**。其低效的查找方式,决定了链表不适合作为索引。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20220320174829.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220320174829.png)

## 哈希索引

哈希表是一种以键 - 值(key-value)对形式存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。

**哈希表** 使用 **哈希函数** 组织数据,以支持快速插入和搜索的数据结构。哈希表的本质是一个数组,其思路是:使用 Hash 函数将 Key 转换为数组下标,利用数组的随机访问特性,使得我们能在 `O(1)` 的时间代价内完成检索。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20220320201844.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20220320201844.png)

有两种不同类型的哈希表:**哈希集合****哈希映射**

Expand Down Expand Up @@ -105,7 +105,7 @@ B+ 树索引适用于**全键值查找**、**键值范围查找**和**键前缀
- 第一,所有的关键字(可以理解为数据)都存储在叶子节点,非叶子节点并不存储真正的数据,所有记录节点都是按键值大小顺序存放在同一层叶子节点上。
- 其次,所有的叶子节点由指针连接。如下图为简化了的`B+Tree`

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20200304235424.jpg)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20200304235424.jpg)

根据叶子节点的内容,索引类型分为主键索引和非主键索引。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ permalink: /pages/5ed2a2/

ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC、Sharding-Proxy 和 Sharding-Sidecar(计划中)这 3 款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151613.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201008151613.png)

#### ShardingSphere-JDBC

Expand All @@ -30,7 +30,7 @@ ShardingSphere 是一套开源的分布式数据库中间件解决方案组成
- 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
- 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151213.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201008151213.png)

#### Sharding-Proxy

Expand All @@ -39,15 +39,15 @@ ShardingSphere 是一套开源的分布式数据库中间件解决方案组成
- 向应用程序完全透明,可直接当做 MySQL/PostgreSQL 使用。
- 适用于任何兼容 MySQL/PostgreSQL 协议的的客户端。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151434.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201008151434.png)

#### Sharding-Sidecar(TODO)

定位为 Kubernetes 的云原生数据库代理,以 Sidecar 的形式代理所有对数据库的访问。 通过无中心、零侵入的方案提供与数据库交互的的啮合层,即 `Database Mesh`,又可称数据库网格。

Database Mesh 的关注重点在于如何将分布式的数据访问应用与数据库有机串联起来,它更加关注的是交互,是将杂乱无章的应用与数据库之间的交互进行有效地梳理。 使用 Database Mesh,访问数据库的应用和数据库终将形成一个巨大的网格体系,应用和数据库只需在网格体系中对号入座即可,它们都是被啮合层所治理的对象。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151557.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201008151557.png)

| _Sharding-JDBC_ | _Sharding-Proxy_ | _Sharding-Sidecar_ | |
| :-------------- | :--------------- | :----------------- | ------ |
Expand All @@ -64,7 +64,7 @@ ShardingSphere-JDBC 采用无中心化架构,适用于 Java 开发的高性能

Apache ShardingSphere 是多接入端共同组成的生态圈。 通过混合使用 ShardingSphere-JDBC 和 ShardingSphere-Proxy,并采用同一注册中心统一配置分片策略,能够灵活的搭建适用于各种场景的应用系统,使得架构师更加自由地调整适合与当前业务的最佳系统架构。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151658.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201008151658.png)

### 功能列表

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ shardingsphere-jdbc 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供
- 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP 等。
- 支持任意实现 JDBC 规范的数据库,目前支持 MySQL,Oracle,SQLServer,PostgreSQL 以及任何遵循 SQL92 标准的数据库。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008151213.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201008151213.png)

## 快速入门

Expand Down Expand Up @@ -88,7 +88,7 @@ DataSource dataSource = ShardingSphereDataSourceFactory.createDataSource(dataSou

ShardingSphere 的 3 个产品的数据分片主要流程是完全一致的。 核心由 `SQL 解析 => 执行器优化 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并`的流程组成。

![img](https://raw.githubusercontent.com/dunwu/images/dev/snap/20201008153551.png)
![img](https://raw.githubusercontent.com/dunwu/images/master/snap/20201008153551.png)

- QL 解析:分为词法解析和语法解析。 先通过词法解析器将 SQL 拆分为一个个不可再分的单词。再使用语法解析器对 SQL 进行理解,并最终提炼出解析上下文。 解析上下文包括表、选择项、排序项、分组项、聚合函数、分页信息、查询条件以及可能需要修改的占位符的标记。
- 执行器优化:合并和优化分片条件,如 OR 等。
Expand Down
Loading

0 comments on commit a1d04b3

Please sign in to comment.