@@ -109,8 +109,6 @@ MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据
109109
110110** MySQL 主从复制是依赖于 binlog 。另外,常见的一些同步 MySQL 数据到其他数据源的工具(比如 canal)的底层一般也是依赖 binlog 。**
111111
112-
113-
114112## 分库分表
115113
116114读写分离主要应对的是数据库读并发,没有解决数据库存储问题。试想一下:** 如果 MySQL 一张表的数据量过大怎么办?**
@@ -121,40 +119,53 @@ MySQL binlog(binary log 即二进制日志文件) 主要记录了 MySQL 数据
121119
122120### 什么是分库?
123121
124- ** 分库** 就是将数据库中的数据分散到不同的数据库上。
122+ ** 分库** 就是将数据库中的数据分散到不同的数据库上,可以垂直分库,也可以水平分库。
123+
124+ ** 垂直分库** 就是把单一数据库按照业务进行划分,不同的业务使用不同的数据库,进而将一个数据库的压力分担到多个数据库。
125+
126+ 举个例子:说你将数据库中的用户表、订单表和商品表分别单独拆分为用户数据库、订单数据库和商品数据库。
127+
128+ ![ 垂直分库] ( ./images/read-and-write-separation-and-library-subtable/vertical-slicing-database.png )
129+
130+ ** 水平分库** 是把同一个表按一定规则拆分到不同的数据库中,每个库可以位于不同的服务器上,这样就实现了水平扩展,解决了单表的存储和性能瓶颈的问题。
125131
126- 下面这些操作都涉及到了分库:
132+ 举个例子:订单表数据量太大,你对订单表进行了水平切分(水平分表),然后将切分后的 2 张订单表分别放在两个不同的数据库。
127133
128- - 你将数据库中的用户表和用户订单表分别放在两个不同的数据库。
129- - 由于用户表数据量太大,你对用户表进行了水平切分,然后将切分后的 2 张用户表分别放在两个不同的数据库。
134+ ![ 水平分库] ( ./images/read-and-write-separation-and-library-subtable/horizontal-slicing-database.png )
130135
131136### 什么是分表?
132137
133138** 分表** 就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。
134139
135- ** 何为垂直拆分?**
136-
137- 简单来说,垂直拆分是对数据表列的拆分,把一张列比较多的表拆分为多张表。
140+ ** 垂直分表** 是对数据表列的拆分,把一张列比较多的表拆分为多张表。
138141
139142举个例子:我们可以将用户信息表中的一些列单独抽出来作为一个表。
140143
141- ** 何为水平拆分?**
142-
143- 简单来说,水平拆分是对数据表行的拆分,把一张行比较多的表拆分为多张表。
144+ ** 水平分表** 是对数据表行的拆分,把一张行比较多的表拆分为多张表,可以解决单一表数据量过大的问题。
144145
145146举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响。
146147
147- [ 《从零开始学架构》 ] ( https://time.geekbang.org/column/intro/100006601?code=i00Nq3pHUcUj04ZWy70NCRl%2FD2Lfj8GVzcGzZ3Wf5Ug%3D ) 中的有一张图片对于垂直拆分和水平拆分的描述还挺直观的 。
148+ 水平拆分只能解决单表数据量大的问题,为了提升性能,我们通常会选择将拆分后的多张表放在不同的数据库中。也就是说,水平分表通常和水平分库同时出现 。
148149
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 )
150151
151152### 什么情况下需要分库分表?
152153
153154遇到下面几种场景可以考虑分库分表:
154155
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+ - ......
158169
159170### 分库分表会带来什么问题呢?
160171
0 commit comments