mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
[docs add]添加数据冷热分离+MySQL性能优化面试题完善
This commit is contained in:
parent
88a179d767
commit
d4e2ffb06f
@ -376,6 +376,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle.
|
|||||||
### 数据库优化
|
### 数据库优化
|
||||||
|
|
||||||
- [数据库读写分离和分库分表](./docs/high-performance/read-and-write-separation-and-library-subtable.md)
|
- [数据库读写分离和分库分表](./docs/high-performance/read-and-write-separation-and-library-subtable.md)
|
||||||
|
- [数据冷热分离](./docs/high-performance/data-cold-hot-separation.md)
|
||||||
- [常见 SQL 优化手段总结](./docs/high-performance/sql-optimization.md)
|
- [常见 SQL 优化手段总结](./docs/high-performance/sql-optimization.md)
|
||||||
- [深度分页介绍及优化建议](./docs/high-performance/deep-pagination-optimization.md)
|
- [深度分页介绍及优化建议](./docs/high-performance/deep-pagination-optimization.md)
|
||||||
|
|
||||||
|
@ -541,6 +541,7 @@ export default sidebar({
|
|||||||
icon: "mysql",
|
icon: "mysql",
|
||||||
children: [
|
children: [
|
||||||
"read-and-write-separation-and-library-subtable",
|
"read-and-write-separation-and-library-subtable",
|
||||||
|
"data-cold-hot-separation",
|
||||||
"sql-optimization",
|
"sql-optimization",
|
||||||
"deep-pagination-optimization",
|
"deep-pagination-optimization",
|
||||||
],
|
],
|
||||||
|
@ -815,6 +815,20 @@ mysql> EXPLAIN SELECT `score`,`name` FROM `cus_order` ORDER BY `score` DESC;
|
|||||||
|
|
||||||
[深度分页介绍及优化建议](../../high-performance/deep-pagination-optimization.md)
|
[深度分页介绍及优化建议](../../high-performance/deep-pagination-optimization.md)
|
||||||
|
|
||||||
|
### 数据冷热分离如何做?
|
||||||
|
|
||||||
|
[数据冷热分离详解](../../high-performance/data-cold-hot-separation.md)
|
||||||
|
|
||||||
|
### 常见的数据库优化方法有哪些?
|
||||||
|
|
||||||
|
- [索引优化](./mysql-index.md)
|
||||||
|
- [读写分离和分库分表](../../high-performance/read-and-write-separation-and-library-subtable.md)
|
||||||
|
- [数据冷热分离](../../high-performance/data-cold-hot-separation.md)
|
||||||
|
- [SQL 优化](../../high-performance/sql-optimization.md)
|
||||||
|
- [深度分页优化](../../high-performance/deep-pagination-optimization.md)
|
||||||
|
- 适当冗余数据
|
||||||
|
- 使用更高的硬件配置
|
||||||
|
|
||||||
## MySQL 学习资料推荐
|
## MySQL 学习资料推荐
|
||||||
|
|
||||||
[**书籍推荐**](../../books/database.md#mysql) 。
|
[**书籍推荐**](../../books/database.md#mysql) 。
|
||||||
|
@ -671,6 +671,10 @@ _为什么会出现误判的情况呢? 我们还要从布隆过滤器的原理
|
|||||||
|
|
||||||
更多关于布隆过滤器的内容可以看我的这篇原创:[《不了解布隆过滤器?一文给你整的明明白白!》](https://javaguide.cn/cs-basics/data-structure/bloom-filter/) ,强烈推荐,个人感觉网上应该找不到总结的这么明明白白的文章了。
|
更多关于布隆过滤器的内容可以看我的这篇原创:[《不了解布隆过滤器?一文给你整的明明白白!》](https://javaguide.cn/cs-basics/data-structure/bloom-filter/) ,强烈推荐,个人感觉网上应该找不到总结的这么明明白白的文章了。
|
||||||
|
|
||||||
|
**3)接口限流**
|
||||||
|
|
||||||
|
根据用户或者 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制,例如将异常 IP 列入黑名单。
|
||||||
|
|
||||||
### 缓存击穿
|
### 缓存击穿
|
||||||
|
|
||||||
#### 什么是缓存击穿?
|
#### 什么是缓存击穿?
|
||||||
@ -683,9 +687,9 @@ _为什么会出现误判的情况呢? 我们还要从布隆过滤器的原理
|
|||||||
|
|
||||||
#### 有哪些解决办法?
|
#### 有哪些解决办法?
|
||||||
|
|
||||||
- 设置热点数据永不过期或者过期时间比较长。
|
1. 设置热点数据永不过期或者过期时间比较长。
|
||||||
- 针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
|
2. 针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
|
||||||
- 请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力。
|
3. 请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力。
|
||||||
|
|
||||||
#### 缓存穿透和缓存击穿有什么区别?
|
#### 缓存穿透和缓存击穿有什么区别?
|
||||||
|
|
||||||
|
68
docs/high-performance/data-cold-hot-separation.md
Normal file
68
docs/high-performance/data-cold-hot-separation.md
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
---
|
||||||
|
title: 数据冷热分离详解
|
||||||
|
category: 高性能
|
||||||
|
head:
|
||||||
|
- - meta
|
||||||
|
- name: keywords
|
||||||
|
content: 数据冷热分离,冷数据迁移,冷数据存储
|
||||||
|
- - meta
|
||||||
|
- name: description
|
||||||
|
content: 数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。
|
||||||
|
---
|
||||||
|
|
||||||
|
## 什么是数据冷热分离?
|
||||||
|
|
||||||
|
数据冷热分离是指根据数据的访问频率和业务重要性,将数据分为冷数据和热数据,冷数据一般存储在存储在低成本、低性能的介质中,热数据高性能存储介质中。
|
||||||
|
|
||||||
|
### 冷数据和热数据
|
||||||
|
|
||||||
|
热数据是指经常被访问和修改且需要快速访问的数据,冷数据是指不经常访问,对当前项目价值较低,但需要长期保存的数据。
|
||||||
|
|
||||||
|
冷热数据到底如何区分呢?有两个常见的区分方法:
|
||||||
|
|
||||||
|
1. **时间维度区分**:按照数据的创建时间、更新时间、过期时间等,将一定时间段内的数据视为热数据,超过该时间段的数据视为冷数据。例如,订单系统可以将 1 年后的订单数据作为冷数据,1 年内的订单数据作为热数据。这种方法适用于数据的访问频率和时间有较强的相关性的场景。
|
||||||
|
2. **访问评率区分**:将高频访问的数据视为热数据,低频访问的数据视为冷数据。例如,内容系统可以将浏览量非常低的文章作为冷数据,浏览量较高的文章作为热数据。这种方法需要记录数据的访问频率,成本较高,适合访问频率和数据本身有较强的相关性的场景。
|
||||||
|
|
||||||
|
几年前的数据并不一定都是热数据,例如一些优质文章发表几年后依然有很多人访问,大部分普通用户新发表的文章却基本没什么人访问。
|
||||||
|
|
||||||
|
这两种区分冷热数据的方法各有优劣,实际项目中,可以将两者结合使用。
|
||||||
|
|
||||||
|
### 冷热分离的思想
|
||||||
|
|
||||||
|
冷热分离的思想非常简单,就是对数据进行分类,然后分开存储。冷热分离的思想可以应用到很多领域和场景中,而不仅仅是数据存储,例如:
|
||||||
|
|
||||||
|
- 邮件系统中,可以将近期的比较重要的邮件放在收件箱,将比较久远的不太重要的邮件存入归档。
|
||||||
|
- 日常生活中,可以将常用的物品放在显眼的位置,不常用的物品放入储藏室或者阁楼。
|
||||||
|
- 图书馆中,可以将最受欢迎和最常借阅的图书单独放在一个显眼的区域,将较少借阅的书籍放在不起眼的位置。
|
||||||
|
- ……
|
||||||
|
|
||||||
|
### 数据冷热分离的优缺点
|
||||||
|
|
||||||
|
- 优点:热数据的查询性能得到优化(用户的绝大部分操作体验会更好)、节约成本(可以冷热数据的不同存储需求,选择对应的数据库类型和硬件配置,比如将热数据放在 SSD 上,将冷数据放在 HDD 上)
|
||||||
|
- 缺点:系统复杂性和风险增加(需要分离冷热数据,数据错误的风险增加)、统计效率低(统计的时候可能需要用到冷库的数据)。
|
||||||
|
|
||||||
|
## 冷数据如何迁移?
|
||||||
|
|
||||||
|
冷数据迁移方案:
|
||||||
|
|
||||||
|
1. 业务层代码实现:当有对数据进行写操作时,触发冷热分离的逻辑,判断数据是冷数据还是热数据,冷数据就入冷库,热数据就入热库。这种方案会影响性能且冷热数据的判断逻辑不太好确定,还需要修改业务层代码,因此一般不会使用。
|
||||||
|
2. 任务调度:可以利用 xxl-job 或者其他分布式任务调度平台定时去扫描数据库,找出满足冷数据条件的数据,然后批量地将其复制到冷库中,并从热库中删除。这种方法修改的代码非常少,非常适合按照时间区分冷热数据的场景。
|
||||||
|
3. 监听数据库的变更日志 binlog :将满足冷数据条件的数据从 binlog 中提取出来,然后复制到冷库中,并从热库中删除。这种方法可以不用修改代码,但不适合按照时间维度区分冷热数据的场景。
|
||||||
|
|
||||||
|
如果你的公司有 DBA 的话,也可以让 DBA 进行冷数据的人工迁移,一次迁移完成冷数据到冷库。然后,再搭配上面介绍的方案实现后续冷数据的迁移工作。
|
||||||
|
|
||||||
|
## 冷数据如何存储?
|
||||||
|
|
||||||
|
冷数据的存储要求主要是容量大,成本低,可靠性高,访问速度可以适当牺牲。
|
||||||
|
|
||||||
|
冷数据存储方案:
|
||||||
|
|
||||||
|
- 中小厂:直接使用 MySQL/PostgreSQL 即可(不改变数据库选型和项目当前使用的数据库保持一致),比如新增一张表来存储某个业务的冷数据或者使用单独的冷库来存放冷数据(涉及跨库查询,增加了系统复杂性和维护难度)
|
||||||
|
- 大厂:Hbase(常用)、RocksDB、Doris、Cassandra
|
||||||
|
|
||||||
|
如果公司成本预算足的话,也可以直接上 TiDB 这种分布式关系型数据库,直接一步到位。TiDB 6.0 正式支持数据冷热存储分离,可以降低 SSD 使用成本。使用 TiDB 6.0 的数据放置功能,可以在同一个集群实现海量数据的冷热存储,将新的热数据存入 SSD,历史冷数据存入 HDD。
|
||||||
|
|
||||||
|
## 案例分享
|
||||||
|
|
||||||
|
- [如何快速优化几千万数据量的订单表 - 程序员济癫 - 2023](https://www.cnblogs.com/fulongyuanjushi/p/17910420.html)
|
||||||
|
- [海量数据冷热分离方案与实践 - 字节跳动技术团队 - 2022](https://mp.weixin.qq.com/s/ZKRkZP6rLHuTE1wvnqmAPQ)
|
@ -4,10 +4,10 @@ category: 高性能
|
|||||||
head:
|
head:
|
||||||
- - meta
|
- - meta
|
||||||
- name: keywords
|
- name: keywords
|
||||||
content: 读写分离,分库分表,主从复制
|
content: 深度分页
|
||||||
- - meta
|
- - meta
|
||||||
- name: description
|
- name: description
|
||||||
content: 读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。 这样的话,就能够小幅提升写性能,大幅提升读性能。 读写分离基于主从复制,MySQL 主从复制是依赖于 binlog 。分库就是将数据库中的数据分散到不同的数据库上。分表就是对单表的数据进行拆分,可以是垂直拆分,也可以是水平拆分。引入分库分表之后,需要系统解决事务、分布式 id、无法 join 操作问题。
|
content: 查询偏移量过大的场景我们称为深度分页,这会导致查询性能较低。深度分页可以采用范围查询、子查询、INNER JOIN 延迟关联、覆盖索引等方法进行优化。
|
||||||
---
|
---
|
||||||
|
|
||||||
## 深度分页介绍
|
## 深度分页介绍
|
||||||
|
@ -362,6 +362,7 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle.
|
|||||||
### 数据库优化
|
### 数据库优化
|
||||||
|
|
||||||
- [数据库读写分离和分库分表](./high-performance/read-and-write-separation-and-library-subtable.md)
|
- [数据库读写分离和分库分表](./high-performance/read-and-write-separation-and-library-subtable.md)
|
||||||
|
- [数据冷热分离](./high-performance/data-cold-hot-separation.md)
|
||||||
- [常见 SQL 优化手段总结](./high-performance/sql-optimization.md)
|
- [常见 SQL 优化手段总结](./high-performance/sql-optimization.md)
|
||||||
- [深度分页介绍及优化建议](./high-performance/deep-pagination-optimization.md)
|
- [深度分页介绍及优化建议](./high-performance/deep-pagination-optimization.md)
|
||||||
|
|
||||||
|
7
pnpm-lock.yaml
generated
7
pnpm-lock.yaml
generated
@ -1,4 +1,4 @@
|
|||||||
lockfileVersion: '6.0'
|
lockfileVersion: '6.1'
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
autoInstallPeers: true
|
autoInstallPeers: true
|
||||||
@ -723,6 +723,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==}
|
resolution: {integrity: sha512-pL6QtV26W52aCWTG1IuFV3FMPL1m4wbsRG+qijIvgFO/VBsiXJjDPE/uiMdHBAO6YcpV4KvpKtd0v3WFbaxBtg==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
@ -730,6 +731,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==}
|
resolution: {integrity: sha512-On+cc5EpOaTwPSNetHXBuqylDW+765G/oqB9xGmWU3npEhCh8xu0xqHGUA+4xwZLqBbIZNcBlKSIYfkBm6ko7g==}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
@ -737,6 +739,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==}
|
resolution: {integrity: sha512-Wnx/IVMSZ31D/cO9HSsU46FjrPWHqtdF8+0eyZ1zIB5a6hXaZXghUKpRrC4D5DcRTZOjml2oBhXoqfGYyXKipw==}
|
||||||
cpu: [riscv64]
|
cpu: [riscv64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
@ -744,6 +747,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==}
|
resolution: {integrity: sha512-ym5x1cj4mUAMBummxxRkI4pG5Vht1QMsJexwGP8547TZ0sox9fCLDHw9KCH9c1FO5d9GopvkaJsBIOkTKxksdw==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
libc: [glibc]
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
@ -751,6 +755,7 @@ packages:
|
|||||||
resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==}
|
resolution: {integrity: sha512-m0hYELHGXdYx64D6IDDg/1vOJEaiV8f1G/iO+tejvRCJNSwK4jJ15e38JQy5Q6dGkn1M/9KcyEOwqmlZ2kqaZg==}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
libc: [musl]
|
||||||
requiresBuild: true
|
requiresBuild: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user