参考1:为什么ClickHouse分析数据库这么强?(原理剖析+应用实践)
参考2:ClickHouse与其他数据库的对比
参考3:到底为什么需要 Clickhouse?
Clickhouse是一种关系型数据库,但与传统的关系型数据库(如MySQL和Oracle)不同。最大的区别在于传统的关系型数据库是行式存储,而Clickhouse是列式存储,所以它也是一个开源列式存储的OLAP(在线分析处理过程)数据库。这种列式存储方式具有天然的优势,即用于统计分析和聚类分析。
Clickhouse适用于写少但查询海量数据的场景。
在性能方面,Clickhouse在相同的服务器配置与数据量下,平均响应速度可以比传统数据库更快。因为它只需要读取要计算的列数据,而非行式的整行数据读取,降低了IO成本。此外,Clickhouse拥有优秀的数据压缩能力。它能够有效地压缩数据,减少存储空间的占用,提高查询效率。
Clickhouse在相同的服务器配置与数据量下,与其他数据库相比,平均响应速度:
Vertica的2.63倍(Vertica是一款收费的列式存储数据库)InfiniDB的17倍(可伸缩的分析数据库引擎,基于Mysql搭建)MonetDB的27倍(开源的列式数据库)Hive的126倍MySQL的429倍Greenplum的10倍Spark的1倍Clickhouse的缺点:
OLAP数据库的缺点)。Clickhouse并不能取代关系型数据,也不是为了处理事务性数据而开发的,Clickhouse更多的是作为OLTP(在线事务处理过程)数据库补充,方便用来进行数据分析。如果需要对数据进行更新和删除,或者需要进行多表关联,那么通常不推荐使用Clickhouse。
MySQL数据更新方便,这对列式存储是硬伤,所以很多OLAP数据库不支持更新,或者用复杂的方式支持更新。I/O,更新一行数据,列式存储需要进行多次I/O,但是行式少数几次就够了。以上是一些优化ClickHouse查询性能的常见方法,实际优化过程中需要结合具体业务场景和数据特点进行调整。
综合来说,这三个键的作用如下:
在设计表时,合理选择和配置这些键是优化ClickHouse查询性能的关键。根据数据分布、查询需求和硬件资源等因素,选择适当的主键、排序键和分区键来优化你的表结构。
选择ClickHouse表的Primary Key(主键)时,需要考虑查询模式、数据分布以及性能优化的目标。以下是一些建议和常见的选择标准:
下面是一个简单的例子,假设有一个存储用户行为日志的表,其中user_id和event_time是两个重要的字段。在这个场景下,可能的主键选择是使用user_id作为主键,或者使用user_id和event_time的组合作为主键。选择哪一个取决于实际的查询需求,如果你更关心按用户ID进行单行查询,那么选择user_id作为主键可能更合适;如果你更关心按时间范围进行查询,那么选择user_id和event_time作为组合主键可能更有意义。
最终的选择需要根据实际业务场景和查询模式来权衡,进行基准测试以确保选择的主键能够在真实场景中提供良好的性能。
在ClickHouse中,创建索引通常是在定义表的时候完成的。ClickHouse提供了几种类型的索引,主要有主键索引、排序索引以及普通索引。下面是一些关于如何在ClickHouse中添加索引的基本信息:
CREATE TABLE example_table
(
column1 UInt32,
column2 String
) ENGINE = MergeTree
ORDER BY column1
PRIMARY KEY column1;
上述例子中,column1被定义为主键。
CREATE TABLE example_table
(
column1 UInt32,
column2 String
) ENGINE = MergeTree
ORDER BY column1;
上述例子中,column1被定义为排序索引。
CREATE TABLE example_table
(
column1 UInt32,
column2 String
) ENGINE = MergeTree
ORDER BY column1
INDEX index_name (column2);
上述例子中,column2被定义为普通索引。
需要注意的是,索引的创建可能会对写入性能产生一定的影响,因此在选择使用索引时需要权衡查询性能和写入性能。此外,对于大规模数据的表,索引的使用需要谨慎,可能需要进行性能测试以确保索引的确能够带来性能的提升。
ClickHouse在设计上已经默认对OLAP(联机分析处理)场景进行了优化,因此对于大规模数据的索引查询已经有很好的性能。然而,以下是一些建议,可以进一步优化ClickHouse中的索引查询:
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);
CREATE TABLE example_table
(
column1 UInt32,
column2 String
) ENGINE = MergeTree
ORDER BY column1
PRIMARY KEY column1
INDEX index_name (column2);
SELECT * FROM example_table SAMPLE 1;
OPTIMIZE TABLE example_table;
这些是一些建议,帮助在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流量、电信、金融、电子商务、信息安全、网络游戏、物联网等众多其他领域。
列式存储
行式存储的特点:
想查找某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以;但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。
列式存储的特点:
灵活的查询语言
几乎覆盖了标准SQL的大部分语法,包括DDL和DML,以及配套的各种函数;用户管理及权限管理、数据的备份与恢复。
高性能
ClickHouse被设计用于处理大规模数据集,可以在秒内处理数十亿行的数据。它支持并行查询执行和高度优化的查询引擎,以确保快速的查询性能。
可扩展性
ClickHouse易于水平扩展。可以通过添加更多的硬件资源或节点来增加其容量和性能,以满足不断增长的数据需求。
多种数据格式支持
ClickHouse支持多种数据格式,包括CSV、JSON、Parquet等,使得它能够与各种数据源集成。
高吞吐写入能力
ClickHouse采用类LSM Tree的结构,数据写入后定期在后台Compaction。通过类LSM tree的结构, ClickHouse在数据导入时全部是顺序append写,写入后数据段不可更改,在后台compaction时也是多个段merge sort后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力。
ClickHouse使用高度优化的压缩算法来存储列数据,以减少存储空间的需求。这些压缩算法可以根据数据的特性自动选择,从而进一步减少磁盘占用和提高查询性能。ClickHouse可以跳过不必要的列,仅访问查询所需的列,从而降低了IO开销和数据传输的成本。这使得ClickHouse在分析查询中非常快速。ClickHouse的列式存储还使得多个查询可以同时访问相同的表,而不会产生锁定或冲突,从而实现了高并发性能。ClickHouse通常比传统的行式存储方式节省更多的存储空间。ClickHouse在物理磁盘上存储数据列时,通常会使用存储引擎中的布局优化,例如MergeTree引擎,以提高数据的可用性和查询性能。总结:
ClickHouse的列式存储是为了最大程度地优化分析性查询而设计的。它通过将数据按列组织、压缩和高效访问,提供了卓越的性能,使其成为处理大规模数据分析任务的理想工具。
ClickHouse主要设计用于批处理分析,因此在处理实时数据和需要低延迟响应的工作负载方面不如一些专门为此目的设计的数据库系统。ClickHouse不支持复杂的事务处理。它专注于分析查询,而不是用于支持在线事务处理(OLTP)工作负载的数据库。ClickHouse支持实时数据插入,但在大量写入数据时,写入性能可能会变得较低。这可能会导致在高写入负载下的性能问题。NoSQL数据库,ClickHouse的生态系统相对较小,可能需要额外的开发工作来实现特定的集成或功能。ClickHouse集群可能需要大量的硬件资源,包括内存和磁盘空间。这可能会导致成本较高,尤其是在云环境中。尽管ClickHouse存在这些缺点,但它在大规模分析性工作负载下的性能和效率通常可以弥补这些限制。选择使用ClickHouse还取决于具体的用例和需求,以确保它是最合适的数据库系统。
ClickHouse使用列式存储,将数据按列而不是按行存储在磁盘上。这意味着查询通常只需要访问所需的列,而不必加载整个行,从而减少了磁盘I/O和内存消耗。ClickHouse使用高度优化的压缩算法来存储数据,减少了磁盘占用和数据传输的成本。这不仅降低了存储成本,还提高了查询性能,因为更少的数据需要从磁盘读取到内存中。ClickHouse支持并行查询执行,可以同时处理多个查询请求。这意味着多个查询可以在不互相干扰的情况下同时运行,提高了系统的吞吐量和响应速度。ClickHouse将数据分成多个分区,每个分区可以独立压缩和查询。这有助于减小查询的数据集大小,提高了查询性能。ClickHouse使用不同类型的索引来加速查询,包括Bloom过滤器、MergeTree索引等。这些索引可以加速特定类型的查询,使其更快速。ClickHouse使用合并树技术来定期合并和优化数据分区,以减少磁盘碎片和提高查询性能。ClickHouse可以预热数据,将数据加载到内存中,以加速查询的响应时间。ClickHouse支持查询结果缓存,可以将查询结果缓存在内存中,以提高重复查询的性能。ClickHouse采用异步方式处理一些操作,如数据插入和合并,以减少对查询性能的影响。ClickHouse可以轻松扩展到多个节点,以处理大规模数据集。这种分布式架构提供了更多的计算和存储资源,进一步提高了性能和容量。总结:
ClickHouse的设计和优化旨在最大程度地提高查询性能和效率,特别适用于大规模分析性工作负载。它的列式存储、压缩算法、并行处理和其他性能优化策略使其成为处理大量数据的理想工具。
ClickHouse引擎分为数据库引擎和数据表引擎 。
参考1:ClickHouse表引擎之Log系列表引擎
引擎这块还需要深入了解一下,有些引擎不支持删改操作。
Ordinary,在这种数据库下面的表可以是任意类型引擎。MergeTree系列,也是官方主推的引擎。MergeTree是基础引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功能,ReplacingMergeTree有了去重功能,SummingMergeTree有了汇总求和功能,AggregatingMergeTree有聚合功能,CollapsingMergeTree有折叠删除功能,VersionedCollapsingMergeTree有版本折叠功能,GraphiteMergeTree有压缩汇总功能。在这些的基础上还可以叠加Replicated和Distributed。Integration系列用于集成外部的数据源,常用的有HADOOP,MySQL。
数据库引擎,默认情况下,ClickHouse使用Atomic数据库引擎。它提供了可配置的table engines和SQL dialect。
MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换。MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中,因此您可以执行诸如SHOW TABLES或SHOW CREATE TABLE之类的操作。MySQL数据同步;将MySQL数据全量或增量方式同步到clickhouse中,解决MySQL服务并发访问压力过大的问题。RAM中保存expiration_time_in_seconds秒。只能用于Log表。Log表而优化的,对于这些表,访问之间有很长的时间间隔。也就是访问不频繁,压缩率高。table engines和SQL dialect。表引擎是 ClickHouse 的一大特色。可以说, 表引擎决定了如何存储表的数据。包括:
参考1:表引擎
表引擎大致可分四个种类。
MergeTree系列引擎支持数据复制(使用Replicated的引擎版本),分区和一些其他引擎不支持的其他功能。该类型的引擎:
MergeTree最常用ReplacingMergeTree最常用SummingMergeTreeAggregatingMergeTreeCollapsingMergeTreeVersionedCollapsingMergeTreeGraphiteMergeTreeTinyLogStripeLogLogKafka比较常用,采集回来的数据先存Kafka然后同步到clickhouseMySQL比较常用。ODBCJDBCHDFSDistributedMaterializedViewDictionaryMergeFileNullSetJoinURLViewMemoryBuffer
ClickHouse的语法与MySQL语法比较接近。在此就不做过多介绍了,可参考:SQL参考
注意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
代码:
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)
连通正常。
github.com/ClickHouse/clickhouse-go/v2里暂时没看到事务相关的特性,所以无法做到对主子表同时保存成功或失败的功能,可以使用gorm。