|
| 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