@@ -109,8 +109,6 @@ MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据
109
109
110
110
** MySQL 主从复制是依赖于 binlog 。另外,常见的一些同步 MySQL 数据到其他数据源的工具(比如 canal)的底层一般也是依赖 binlog 。**
111
111
112
-
113
-
114
112
## 分库分表
115
113
116
114
读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:** 如果 MySQL 一张表的数据量过大怎么办?**
@@ -121,40 +119,53 @@ MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据
121
119
122
120
### 什么是分库?
123
121
124
- ** 分库** 就是将数据库中的数据分散到不同的数据库上。
122
+ ** 分库** 就是将数据库中的数据分散到不同的数据库上,可以垂直分库,也可以水平分库。
123
+
124
+ ** 垂直分库** 就是把单一数据库按照业务进行划分,不同的业务使用不同的数据库,进而将一个数据库的压力分担到多个数据库。
125
+
126
+ 举个例子:说你将数据库中的用户表、订单表和商品表分别单独拆分为用户数据库、订单数据库和商品数据库。
127
+
128
+ ![ 垂直分库] ( ./images/read-and-write-separation-and-library-subtable/vertical-slicing-database.png )
129
+
130
+ ** 水平分库** 是把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,这样就实现了水平扩展,解决了单表的存储和性能瓶颈的问题。
125
131
126
- 下面这些操作都涉及到了分库:
132
+ 举个例子:订单表数据量太大,你对订单表进行了水平切分(水平分表),然后将切分后的 2 张订单表分别放在两个不同的数据库。
127
133
128
- - 你将数据库中的用户表和用户订单表分别放在两个不同的数据库。
129
- - 由于用户表数据量太大,你对用户表进行了水平切分,然后将切分后的 2 张用户表分别放在两个不同的数据库。
134
+ ![ 水平分库] ( ./images/read-and-write-separation-and-library-subtable/horizontal-slicing-database.png )
130
135
131
136
### 什么是分表?
132
137
133
138
** 分表** 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
134
139
135
- ** 何为垂直拆分?**
136
-
137
- 简单来说,垂直拆分是对数据表列的拆分,把一张列比较多的表拆分为多张表。
140
+ ** 垂直分表** 是对数据表列的拆分,把一张列比较多的表拆分为多张表。
138
141
139
142
举个例子:我们可以将用户信息表中的一些列单独抽出来作为一个表。
140
143
141
- ** 何为水平拆分?**
142
-
143
- 简单来说,水平拆分是对数据表行的拆分,把一张行比较多的表拆分为多张表。
144
+ ** 水平分表** 是对数据表行的拆分,把一张行比较多的表拆分为多张表,可以解决单一表数据量过大的问题。
144
145
145
146
举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响。
146
147
147
- [ 《从零开始学架构》 ] ( https://time.geekbang.org/column/intro/100006601?code=i00Nq3pHUcUj04ZWy70NCRl%2FD2Lfj8GVzcGzZ3Wf5Ug%3D ) 中的有一张图片对于垂直拆分和水平拆分的描述还挺直观的 。
148
+ 水平拆分只能解决单表数据量大的问题,为了提升性能,我们通常会选择将拆分后的多张表放在不同的数据库中。也就是说,水平分表通常和水平分库同时出现 。
148
149
149
- ![ ] ( https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/java-guide-blog/662ea3bda90061d0b40177e3a46fefc3.jpg )
150
+ ![ 分表 ] ( ./images/read-and-write-separation-and-library-subtable/two-forms-of-sub-table.png )
150
151
151
152
### 什么情况下需要分库分表?
152
153
153
154
遇到下面几种场景可以考虑分库分表:
154
155
155
- - 单表的数据达到千万级别以上,数据库读写速度比较缓慢(分表)。
156
- - 数据库中的数据占用的空间越来越大,备份时间越来越长(分库)。
157
- - 应用的并发量太大(分库)。
156
+ - 单表的数据达到千万级别以上,数据库读写速度比较缓慢。
157
+ - 数据库中的数据占用的空间越来越大,备份时间越来越长。
158
+ - 应用的并发量太大。
159
+
160
+ ### 常见的分片算法有哪些?
161
+
162
+ 分片算法主要解决了数据被水平分片之后,数据究竟该存放在哪个表的问题。
163
+
164
+ - ** 哈希分片** :求指定 key(比如 id) 的哈希,然后根据哈希值确定数据应被放置在哪个表中。哈希分片比较适合随机读写的场景,不太适合经常需要范围查询的场景。
165
+ - ** 范围分片** :按照特性的范围区间(比如时间区间、ID区间)来分配数据,比如 将 ` id ` 为 ` 1~299999 ` 的记录分到第一个库, ` 300000~599999 ` 的分到第二个库。范围分片适合需要经常进行范围查找的场景,不太适合随机读写的场景(数据未被分散,容易出现热点数据的问题)。
166
+ - ** 地理位置分片** :很多 NewSQL 数据库都支持地理位置分片算法,也就是根据地理位置(如城市、地域)来分配数据。
167
+ - ** 融合算法** :灵活组合多种分片算法,比如将哈希分片和范围分片组合。
168
+ - ......
158
169
159
170
### 分库分表会带来什么问题呢?
160
171
0 commit comments