Skip to content

Commit a84c379

Browse files
committed
perf:细分专栏
1 parent f1aa2fb commit a84c379

File tree

5 files changed

+471
-38
lines changed

5 files changed

+471
-38
lines changed

docs/.vuepress/config.js

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ module.exports = {
218218
},
219219
]
220220
},
221+
221222
{
222223
text: 'RocketMQ',
223224
items: [{
@@ -226,6 +227,15 @@ module.exports = {
226227
},
227228
]
228229
},
230+
231+
{
232+
text: 'RabbitMQ',
233+
items: [{
234+
text: '00-RabbitMQ',
235+
link: '/md/rabbitmq/00-RabbitMQ实战下载与安装.md'
236+
},
237+
]
238+
},
229239
]
230240
},
231241

@@ -401,24 +411,28 @@ module.exports = {
401411
{
402412
text: '计基',
403413
items: [{
414+
text: '计算机网络',
415+
items: [{
404416
text: '00-计算机网络-网络层原理',
405417
link: '/md/network/计算机网络-网络层原理.md'
406-
},
407-
{
408-
text: '阿里秋招算法',
409-
items: [{
410-
text: '00-阿里秋招高频算法题汇总-基础篇',
411-
link: '/md/algorithm/logic/leetcode/00-阿里秋招高频算法题汇总-基础篇.md'
412-
},
413-
{
414-
text: '01-阿里秋招高频算法题汇总-中级篇',
415-
link: '/md/algorithm/logic/leetcode/01-阿里秋招高频算法题汇总-中级篇.md'
416-
},
417-
{
418-
text: '02-阿里秋招高频算法题汇总-进阶篇',
419-
link: '/md/algorithm/logic/leetcode/02-阿里秋招高频算法题汇总-进阶篇.md'
420-
}
421-
]
418+
}, ]
419+
},
420+
421+
{
422+
text: '阿里秋招算法',
423+
items: [{
424+
text: '00-阿里秋招高频算法题汇总-基础篇',
425+
link: '/md/algorithm/logic/leetcode/00-阿里秋招高频算法题汇总-基础篇.md'
426+
},
427+
{
428+
text: '01-阿里秋招高频算法题汇总-中级篇',
429+
link: '/md/algorithm/logic/leetcode/01-阿里秋招高频算法题汇总-中级篇.md'
430+
},
431+
{
432+
text: '02-阿里秋招高频算法题汇总-进阶篇',
433+
link: '/md/algorithm/logic/leetcode/02-阿里秋招高频算法题汇总-进阶篇.md'
434+
}
435+
]
422436
}
423437
]
424438
},
@@ -645,7 +659,8 @@ module.exports = {
645659
collapsable: false,
646660
sidebarDepth: 0,
647661
children: [
648-
"计算机网络-网络层原理.md"
662+
"计算机网络-网络层原理",
663+
"超线程(Hyper-Threading),单指令多数据流(SIMD)技术"
649664
]
650665
}],
651666
// "/md/MQTT/": [
@@ -777,6 +792,14 @@ module.exports = {
777792
"Kafka门派知多少.md",
778793
"15-基于kafka实现延迟队列.md"
779794
]
795+
}],
796+
"/md/rabbitmq": [{
797+
title: "RabbitMQ",
798+
collapsable: false,
799+
sidebarDepth: 0,
800+
children: [
801+
"00-RabbitMQ实战下载与安装.md",
802+
]
780803
}],
781804
"/md/redis/": [{
782805
title: "Redis",
@@ -805,6 +828,7 @@ module.exports = {
805828
collapsable: false,
806829
sidebarDepth: 0,
807830
children: [
831+
"clickhouse概述",
808832
"为啥要学习ClickHouse",
809833
"学习基础",
810834
]

docs/md/ck/clickhouse概述.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# clickhouse概述
2+
3+
## 1 向量执行引擎
4+
5+
向量化执行引擎:利用CPU的SIMD指令来处理计算
6+
7+
SIMD并行优势:对于执行相同操作的数据,一条SIMD指令可以处理多条数据。
8+
9+
## 2 codegen
10+
11+
一种通过生成代码的方式来优化查询执行的技术。可在运行时自动生成针对特定查询的高效代码,以提高查询性能和减少资源消耗。
12+
13+
1. **根据SQL自动生成代码**: Codegen技术会解析SQL查询语句,分析其中涉及的表、字段、过滤条件、聚合操作等信息,并根据这些信息自动生成相应的执行代码。这些代码通常是针对特定查询优化过的,可以减少不必要的计算和数据处理步骤,提高执行效率。
14+
2. **编译执行**: 自动生成的代码会被编译成可执行的二进制形式,以便在查询执行时直接调用,而不需要再进行解释或动态生成。这样可以减少查询执行过程中的开销,提高执行速度。
15+
3. **消除大量操作符(Operator)调用**: Codegen技术可以消除一些不必要的操作符调用,比如优化查询计算过程中的逻辑判断、数据类型转换等操作,从而减少代码中的冗余计算和函数调用,提高执行效率。
16+
4. **没有if-else分支**: Codegen生成的代码通常会避免使用复杂的if-else分支结构,而是通过优化的逻辑和算法来实现查询的逻辑。这样可以减少分支判断带来的性能损耗,提高代码执行的并行度和效率。
17+
18+
总体来说,ClickHouse的codegen技术通过自动生成优化的执行代码、编译执行、消除冗余操作和精简逻辑结构等手段,可以有效提升查询性能和降低系统资源消耗,特别是在处理大数据量和复杂查询时具有显著的优势。
19+
20+
## 3 横向对比
21+
22+
### 3.1 MySQL适用场景
23+
24+
非常小的数据量的数据分析。
25+
26+
通常可用于数仓的数据应用层的数据存储,支持数据更新、删除的需求,一般用于对接BI报表、自定义报表等。
27+
28+
| 特性 | MySQL | ClickHouse |
29+
| ---------- | ------------------------------ | ------------------------------------------------------------ |
30+
| 查询语法 | SQL | 支持大部分标准SQL,内置少量专用SQL语法 |
31+
| 读写阻塞 | 高并发读写可能产生热点 | 读写相互不影响 |
32+
| 可扩展性 | 分库分表 | 集群方式横向扩展 |
33+
| 数据一致性 | 支持完整的ACID事务 | 支持原子性,在同一个批次中可保证数据一致性 |
34+
| 性能 | 查询性能较一般,写入吞吐量有限 | 写入吞吐量接近网卡带宽,大数据场景的数据查询,比 MySQL查询性能快千百倍 |
35+
| 存储 | 行式 | 列式 |
36+
| 使用场景 | 存储事务型、增删改频繁的数据 | 超大容量的数据分析汇总场景 |
37+
38+
### 3.2 Elasticsearch
39+
40+
主要用于数据的全文检索和数据分析场景,但是数据分析的功能有限。
41+
42+
Elasticsearch也可作为数据应用层的数据存储。
43+
44+
| 特性 | ClickHouse | Elasticsearch |
45+
| -------- | ------------------------------------------------------------ | ----------------------------------- |
46+
| 查询语法 | 支持复杂SQL | DSL, 有限的SQL支持 |
47+
| 读写阻塞 | 读写相互不影响 | 高并发读写可能产生热点 |
48+
| 资源占用 | CPU密集型,能充分利用主机内存和CPU | CPU密集型,单节点内存建议不超过64GB |
49+
| 节点规划 | 少,约为Elasticsearch的5%-10%左右 ||
50+
| 集群架构 | 多主 | 主从 |
51+
| 数据检索 | 主键/索引查询速度快,占用资源少;<br>非主键查询速度快,资源多 | 支持索引字段查询,速度快 |
52+
| 数据分析 | 适合OLAP分析,速度快 | 分析功能有限,不能关联 |
53+
54+
ES CPU密集型,单节点内存建议不超过64GB,32G 用于 ES 内存,另外 32G 用于缓存。若 ES 内存超过 32G,会出现指针压缩问题,导致性能急剧下降。
55+
56+
57+
Elasticsearch在处理大规模数据时,确实存在一些关于内存使用的最佳实践和性能优化建议。以下是关于ES内存使用和性能问题的一些解释:
58+
59+
1. **CPU密集型**:Elasticsearch在处理数据时通常是CPU密集型任务,因为需要进行索引、搜索、聚合等复杂计算操作,而不仅仅是简单的数据存储和检索。
60+
2. **单节点内存建议**:对于单个Elasticsearch节点,一般建议将内存一分为二,其中一部分用于ES的内存需求,另一部分用于操作系统的文件系统缓存。这样可以使ES能够高效利用内存来加速数据检索和处理,同时也可以通过文件系统缓存提升磁盘IO性能。
61+
3. **指针压缩问题**:当ES的Java堆内存超过32GB时,会启用指针压缩(compressed oops)。指针压缩可以减少指针的内存占用,但也可能会导致一些性能上的影响,如增加了对象引用的间接寻址等。在一些情况下,指针压缩可能会对内存和性能产生负面影响,因此需要谨慎考虑内存的配置和使用。
62+
4. **性能下降**:当ES内存超过32GB并启用指针压缩时,可能会出现性能下降的情况,特别是在涉及大量对象引用或频繁的内存访问操作时。这可能导致GC(垃圾回收)压力增加、对象分配和回收的开销增加等问题,进而影响系统整体的性能表现。
63+
64+
综上所述,对于Elasticsearch的内存配置和性能优化,需要根据具体的应用场景和硬件资源情况来进行调整和优化。合理的内存分配、GC调优、索引设计等都可以对ES的性能产生积极影响。同时,监控和调整系统参数也是保证ES稳定性和性能的关键。
65+
66+
### 3.3 HBase
67+
68+
主要用于解决数据的实时查询问题,根据主键(rowkey),从海量明细数据中进行随机查询,通常是返回少量的记录数。
69+
70+
不支持数据的join、多级索引等
71+
72+
| 特性 | HBase | ClickHouse |
73+
| -------- | ---------------------------------------------- | ------------------------------------------------------------ |
74+
| 查询语法 | 专用API,默认不支持SQL | 支持复杂SQL |
75+
| 读写阻塞 | 高并发读写产生region热点 | 读写相互不影响 |
76+
| 数据分析 | 不适合用于分析的数据源 | 适合OLAP分析,速度快 |
77+
| 集群架构 | 主从 | 多主 |
78+
| 数据检索 | 适用于rowkey查询返回少量记录;非rowkey全表扫描 | 主键/索引查询速度快,占用资源少;非主键查询,速度快,占用资源多 |
79+
| 可维护性 | 维护复杂,元数据损坏可能导致数据不可用 | 易于扩展,数据容易恢复 |
80+
81+
### 3.4 clickhouse适用场景
82+
83+
- 建立大宽表模型,进行各种复杂的数据聚合操作,没有复杂join操作,查询请求秒级返回
84+
- 基于RocksDB引擎,实现数据的实时更新和查询,类似Hbase功能
85+
- 基于Projection,进行数据的预聚合,可实现类似MOLAP数据库以及二级索引的功能
86+
- 与MySQL等异构数据源的数据进行数据的接入和关联等

0 commit comments

Comments
 (0)