既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
ClickHouse在设计上已经默认对OLAP(联机分析处理)场景进行了优化,因此对于大规模数据的索引查询已经有很好的性能。然而,以下是一些建议,可以进一步优化ClickHouse中的索引查询:
- 合理使用主键:主键是唯一性索引,ClickHouse使用主键来快速查找特定行。因此,合理选择主键是非常关键的。主键应该是你经常用于查询的字段,以确保单行查询的高效性。
- 合理使用排序键:排序键对于范围查询的性能提升很大。在创建表时,使用ORDER BY子句来定义排序键,以确保按照特定顺序存储数据。这对于时间序列数据等场景特别有效。
CREATE TABLE example_table
(
column1 UInt32,
column2 String
) ENGINE = MergeTree
ORDER BY column1;
- 适当的分区键:如果数据表非常大,合理使用分区键可以显著提高查询性能。分区键可以将数据分散存储在不同的物理位置上,以减少扫描的数据量。
CREATE TABLE example_table
(
column1 UInt32,
column2 String
) ENGINE = MergeTree
PARTITION BY toYYYYMM(column1);
- 合理选择索引:ClickHouse支持主键索引、排序索引和普通索引。在创建表时,选择适当的索引类型。主键用于唯一性标识行,排序索引用于范围查询,普通索引用于非唯一性的索引需求。
CREATE TABLE example_table
(
column1 UInt32,
column2 String
) ENGINE = MergeTree
ORDER BY column1
PRIMARY KEY column1
INDEX index_name (column2);
- 使用样本数据进行测试:在实际使用中,使用样本数据进行测试,观察查询性能,特别是在对表结构进行更改之前。ClickHouse提供了SAMPLE关键字,用于在查询中使用部分数据进行测试和优化。
SELECT \* FROM example_table SAMPLE 1;
- 定期维护和优化表:对于MergeTree引擎,定期执行优化操作是重要的。这包括删除过期数据、合并分区以及执行优化操作。ClickHouse提供了OPTIMIZE TABLE命令用于执行这些操作。
OPTIMIZE TABLE example_table;
这些是一些建议,帮助在ClickHouse中进行索引查询优化。实际优化过程中,需要结合具体的业务场景、数据分布和查询需求来调整表结构和索引的设计。
2 ClickHouse简介
参考1:大数据技术之 ClickHouse
参考2:ClickHouse官方介绍
参考3:ClickHouse介绍
参考4:篇一|ClickHouse快速入门
推荐阅读参考1、2
,优先阅读参考1
。
ClickHouse
是俄罗斯
的Yandex
于2016年开源的用于联机分析(OLAP :Online Analytical Processing
的列式
数据库管理系统(DBMS:Database Management System),能够使用SQL
查询实时生成分析数据报告,主要用于Web
流量分析。ClickHouse的全称是Click Stream,Data WareHouse
。
ClickHouse
非常适用于商业智能领域,除此之外,它也能够被广泛应用于广告流量、Web
、App
流量、电信、金融、电子商务、信息安全、网络游戏、物联网等众多其他领域。
3 ClickHouse特点
- 列式存储
行式存储的特点:
想查找某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以;但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。
列式存储的特点:
* 对于列的聚合、计数、求和等统计操作优于**行式存储**。
* 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重。
* 数据压缩比更好,一方面**节省了磁盘空间**,另一方面**对于cache也有了更大的发挥空间**。
* 它在分析查询中非常高效,特别是在需要聚合大量数据时。
* **列式存储不支持事务**。
- 灵活的查询语言
几乎覆盖了标准SQL
的大部分语法,包括DDL
和DML
,以及配套的各种函数;用户管理及权限管理、数据的备份与恢复。 - 高性能
ClickHouse
被设计用于处理大规模数据集,可以在秒内处理数十亿行的数据。它支持并行查询执行和高度优化的查询引擎,以确保快速的查询性能。 - 可扩展性
ClickHouse
易于水平扩展。可以通过添加更多的硬件资源或节点来增加其容量和性能,以满足不断增长的数据需求。 - 多种数据格式支持
ClickHouse
支持多种数据格式,包括CSV
、JSON
、Parquet
等,使得它能够与各种数据源集成。 - 高吞吐写入能力
ClickHouse
采用类LSM Tree
的结构,数据写入后定期在后台Compaction。通过类LSM tree
的结构,ClickHouse
在数据导入时全部是顺序append
写,写入后数据段不可更改,在后台compaction
时也是多个段merge sort
后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力。
3.1 clickhouse的列式存储
- 列式存储原理:在列式存储中,表中的每个列都被单独存储在磁盘上,而不是将整个行作为一个单元存储。这意味着数据表中的每一列都以连续的方式存储在磁盘上,而不是以行的方式存储。这种存储方式使得在分析性工作负载下非常高效,因为查询通常只需要访问一部分列,而不是整个行。
- 列压缩:
ClickHouse
使用高度优化的压缩算法来存储列数据,以减少存储空间的需求。这些压缩算法可以根据数据的特性自动选择,从而进一步减少磁盘占用和提高查询性能。 - 数据访问效率:由于数据存储在列中,
ClickHouse
可以跳过不必要的列,仅访问查询所需的列,从而降低了IO
开销和数据传输的成本。这使得ClickHouse
在分析查询中非常快速。 - 高并发性能:
ClickHouse
的列式存储还使得多个查询可以同时访问相同的表,而不会产生锁定或冲突,从而实现了高并发性能。 - 节省空间:由于列式存储使用了压缩技术,并且数据通常是高度重复的,因此
ClickHouse
通常比传统的行式存储方式节省更多的存储空间。 - 数据列的物理布局:
ClickHouse
在物理磁盘上存储数据列时,通常会使用存储引擎中的布局优化,例如MergeTree
引擎,以提高数据的可用性和查询性能。
总结:
ClickHouse
的列式存储是为了最大程度地优化分析性查询而设计的。它通过将数据按列组织、压缩和高效访问,提供了卓越的性能,使其成为处理大规模数据分析任务的理想工具。
4 clickhouse缺点
- 实时性限制:
ClickHouse
主要设计用于批处理分析,因此在处理实时数据和需要低延迟响应的工作负载方面不如一些专门为此目的设计的数据库系统。 - 不适用于事务处理:
ClickHouse
不支持复杂的事务处理。它专注于分析查询,而不是用于支持在线事务处理(OLTP
)工作负载的数据库。 - 写入性能:尽管
ClickHouse
支持实时数据插入,但在大量写入数据时,写入性能可能会变得较低。这可能会导致在高写入负载下的性能问题。 - 较小的生态系统:相对于一些主流的关系型数据库或
NoSQL
数据库,ClickHouse
的生态系统相对较小,可能需要额外的开发工作来实现特定的集成或功能。 - 资源需求:处理大规模数据集的
ClickHouse
集群可能需要大量的硬件资源,包括内存和磁盘空间。这可能会导致成本较高,尤其是在云环境中。
尽管ClickHouse
存在这些缺点,但它在大规模分析性工作负载下的性能和效率通常可以弥补这些限制。选择使用ClickHouse
还取决于具体的用例和需求,以确保它是最合适的数据库系统。
5 clickhouse为什么快
- 列式存储:
ClickHouse
使用列式存储,将数据按列而不是按行存储在磁盘上。这意味着查询通常只需要访问所需的列,而不必加载整个行,从而减少了磁盘I/O
和内存消耗。 - 压缩算法:
ClickHouse
使用高度优化的压缩算法来存储数据,减少了磁盘占用和数据传输的成本。这不仅降低了存储成本,还提高了查询性能,因为更少的数据需要从磁盘读取到内存中。 - 并行查询:
ClickHouse
支持并行查询执行,可以同时处理多个查询请求。这意味着多个查询可以在不互相干扰的情况下同时运行,提高了系统的吞吐量和响应速度。 - 数据分区:
ClickHouse
将数据分成多个分区,每个分区可以独立压缩和查询。这有助于减小查询的数据集大小,提高了查询性能。 - 索引结构:
ClickHouse
使用不同类型的索引来加速查询,包括Bloom
过滤器、MergeTree
索引等。这些索引可以加速特定类型的查询,使其更快速。 - 合并树:
ClickHouse
使用合并树技术来定期合并和优化数据分区,以减少磁盘碎片和提高查询性能。 - 数据预热:
ClickHouse
可以预热数据,将数据加载到内存中,以加速查询的响应时间。 - 缓存:
ClickHouse
支持查询结果缓存,可以将查询结果缓存在内存中,以提高重复查询的性能。 - 异步处理:
ClickHouse
采用异步方式处理一些操作,如数据插入和合并,以减少对查询性能的影响。 - 分布式架构:
ClickHouse
可以轻松扩展到多个节点,以处理大规模数据集。这种分布式架构提供了更多的计算和存储资源,进一步提高了性能和容量。
总结:
ClickHouse
的设计和优化旨在最大程度地提高查询性能和效率,特别适用于大规模分析性工作负载。它的列式存储、压缩算法、并行处理和其他性能优化策略使其成为处理大量数据的理想工具。
6 ClickHouse引擎
ClickHouse
引擎分为数据库引擎和数据表引擎 。
参考1:ClickHouse表引擎之Log系列表引擎
引擎这块还需要深入了解一下,有些引擎不支持删改操作。
※5.1 ClickHouse数据引擎总结
- 数据库引擎默认是
Ordinary
,在这种数据库下面的表可以是任意类型引擎。 - 生产环境中常用的表引擎是
MergeTree
系列,也是官方主推的引擎。MergeTree
是基础引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,ReplacingMergeTree
有了去重功能,SummingMergeTree
有了汇总求和功能,AggregatingMergeTree
有聚合功能,CollapsingMergeTree
有折叠删除功能,VersionedCollapsingMergeTree
有版本折叠功能,GraphiteMergeTree
有压缩汇总功能。在这些的基础上还可以叠加Replicated
和Distributed
。
Integration
系列用于集成外部的数据源,常用的有HADOOP
,MySQL
。
6.2 数据库引擎
数据库引擎,默认情况下,ClickHouse
使用Atomic
数据库引擎。它提供了可配置的table engines
和SQL dialect
。
- MySQL
MySQL
引擎用于将远程的MySQL
服务器中的表映射到ClickHouse
中,并允许您对表进行INSERT
和SELECT
查询,以方便您在ClickHouse
与MySQL
之间进行数据交换。
MySQL
数据库引擎会将对其的查询转换为MySQL
语法并发送到MySQL
服务器中,因此您可以执行诸如SHOW TABLES
或SHOW CREATE TABLE
之类的操作。 - MaterializeMySQL
MySQL
数据同步;将MySQL
数据全量或增量方式同步到clickhouse
中,解决MySQL
服务并发访问压力过大的问题。 - Lazy
在最后一次访问之后,只在RAM
中保存expiration_time_in_seconds
秒。只能用于Log
表。
它是为存储许多小的Log
表而优化的,对于这些表,访问之间有很长的时间间隔。也就是访问不频繁,压缩率高。 - Atomic
默认的数据库引擎。它提供了可配置的table engines
和SQL dialect
。 - PostgreSQL
- MaterializedPostgreSQL
- Replicated
- SQLite
6.3 数据表引擎
表引擎是 ClickHouse
的一大特色。可以说, 表引擎决定了如何存储表的数据。包括:
- 数据的存储方式和位置,写到哪里以及从哪里读取数据。
- 支持哪些查询以及如何支持。
- 并发数据访问。
- 索引的使用(如果存在)。
- 是否可以执行多线性请求。
- 数据复制参数。
6.3.1 表引擎类型
参考1:表引擎
表引擎大致可分四个种类。
- 合并树家族
适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。MergeTree
系列引擎支持数据复制(使用Replicated
的引擎版本),分区和一些其他引擎不支持的其他功能。
该类型的引擎:
MergeTree
最常用ReplacingMergeTree
最常用SummingMergeTree
AggregatingMergeTree
CollapsingMergeTree
VersionedCollapsingMergeTree
GraphiteMergeTree
- 日志引擎系列
具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。
该类型的引擎:
TinyLog
StripeLog
Log
- 集成的表引擎
用于与其他的数据存储与处理系统集成的引擎。
该类型的引擎:
Kafka
比较常用,采集回来的数据先存Kafka
然后同步到clickhouse
MySQL
比较常用。ODBC
JDBC
HDFS
- 特别
该类型的引擎:
Distributed
MaterializedView
Dictionary
Merge
File
Null
Set
Join
URL
View
Memory
Buffer
6.4 数据类型
7 ClickHouse使用语法
ClickHouse
的语法与MySQL
语法比较接近。在此就不做过多介绍了,可参考:SQL参考
8 代码操作ClickHouse
8.1 go.mod
注意clickhouse-go/v2
版本的问题,使用 github.com/ClickHouse/clickhouse-go/v2 v2.4.1
会报:
WARNING: version 21.3.19 of ClickHouse is not supported by this client
ClickHouse (clickhouse-standalone) server version 21.3.19 revision 54447 (timezone Asia/Shanghai)
降级改为 github.com/ClickHouse/clickhouse-go/v2 v2.2.0
即可。
module clickhouse_demo
go 1.19
require github.com/ClickHouse/clickhouse-go/v2 v2.2.0
8.2 测试是否连通clickhouse
代码:
package main
import (
"fmt"
"github.com/ClickHouse/clickhouse-go/v2"
)
func main() {
conn, \_ := clickhouse.Open(&clickhouse.Options{Addr: []string{"192.168.13.10:9000"}})
v, \_ := conn.ServerVersion()
fmt.Println(v.String())
}
结果:
API server listening at: 127.0.0.1:51175
ClickHouse (clickhouse-standalone) server version 22.2.2 revision 54455 (timezone Asia/Shanghai)
连通正常。
8.3 注意
github.com/ClickHouse/clickhouse-go/v2里暂时没看到事务相关的特性,所以无法做到对主子表同时保存成功或失败的功能,可以使用gorm。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
功能,可以使用gorm。
[外链图片转存中…(img-HgkIwEvo-1715378196776)]
[外链图片转存中…(img-7iIYjHYm-1715378196776)]
[外链图片转存中…(img-o46dZ1iw-1715378196776)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新