diff --git a/notes/MySQL.md b/notes/MySQL.md index a7309249..87b4c233 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -14,12 +14,11 @@ * [索引优化](#索引优化) * [B-Tree 和 B+Tree 原理](#b-tree-和-b+tree-原理) * [四、查询性能优化](#四查询性能优化) -* [五、分库与分表](#五分库与分表) - * [原因](#原因) - * [实现方式](#实现方式) - * [Merge 存储引擎](#merge-存储引擎) +* [五、切分](#五切分) + * [垂直切分](#垂直切分) + * [水平切分](#水平切分) + * [切分的选择](#切分的选择) * [存在的问题](#存在的问题) - * [分表与分区的不同](#分表与分区的不同) * [六、故障转移和故障恢复](#六故障转移和故障恢复) * [参考资料](#参考资料) @@ -322,6 +321,7 @@ SELECT * FROM sakila.film_actor WHERE film_id = 1; ```sql DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); ``` + ```sql rows_affected = 0 do { @@ -330,32 +330,25 @@ do { } while rows_affected > 0 ``` -# 五、分库与分表 +# 五、切分 -## 原因 随着时间和业务的发展,数据库中的表会越来越多,并且表中的数据量也会越来越大,那么读写操作的开销也会随着增大。 -## 实现方式 - -### 1. 垂直切分 +## 垂直切分 将表按功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立商品数据库 payDB、用户数据库 userDB 等,分别用来存储项目与商品有关的表和与用户有关的表。 -### 2. 水平切分 +## 水平切分 把表中的数据按照某种规则存储到多个结构相同的表中,例如按 id 的散列值、性别等进行划分。 -### 3. 切分的选择 +## 切分的选择 如果数据库中的表太多,并且项目各项业务逻辑清晰,那么垂直切分是首选。 如果数据库的表不多,但是单表的数据量很大,应该选择水平切分。 -## Merge 存储引擎 - -该存储引擎支持分表。 - ## 存在的问题 ### 1. 事务问题 @@ -370,9 +363,6 @@ do { 最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算。 -## 分表与分区的不同 - -分表,就是将一张表分成多个小表,这些小表拥有不同的表名;而分区是将一张表的数据分为多个区块,这些区块可以存储在同一个磁盘上,也可以存储在不同的磁盘上,这种方式下表仍然只有一个。 # 六、故障转移和故障恢复 @@ -390,8 +380,6 @@ do { 通过代理,可以路由流量到可以使用的服务器上。 -

- ### 在应用中处理故障转移 将故障转移整合到应用中可能导致应用变得太过笨拙。 @@ -399,6 +387,7 @@ do { # 参考资料 - 高性能 MySQL +- [How Sharding Works](https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6) - [MySQL 索引背后的数据结构及算法原理 ](http://blog.codinglabs.org/articles/theory-of-mysql-index.html) - [20+ 条 MySQL 性能优化的最佳经验 ](https://www.jfox.info/20-tiao-mysql-xing-nen-you-hua-de-zui-jia-jing-yan.html) - [数据库为什么分库分表?mysql的分库分表方案](https://www.i3geek.com/archives/1108)