👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO TOP红人
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
✊✊ 感觉对你有帮助的朋友,可以给博主一个三连,非常感谢 🙏🙏🙏
@[TOC]
写在前面
🔔 近几年 Clickhouse 在大数据场景下表现非常不错,应用也越来越广,从事大数据场景开发的同学都可以学起来。目前我们系统已经通过它存储几十亿的数据了,性能依旧杠杠的。
1、Clickhouse 是什么?
ClickHouse是一个开源的列式数据库管理系统(DBMS),专门用于处理大规模数据分析和实时查询。它最初由俄罗斯的Yandex开发,于2016年开源发布。ClickHouse的设计目标是提供高性能、可扩展和可靠的数据存储解决方案,适用于需要快速处理大量数据的场景。
ClickHouse的诞生可以追溯到Yandex内部的需求。Yandex是俄罗斯最大的互联网公司之一,他们在处理大规模数据分析时遇到了传统数据库的性能瓶颈。为了解决这个问题,Yandex团队开始开发ClickHouse,以满足他们对高性能和可扩展性的需求。
在2016年,Yandex将ClickHouse开源发布,成为一个独立的开源项目。自此以后,ClickHouse逐渐吸引了全球范围内的用户和开发者的关注,并得到了广泛的应用。
ClickHouse的发展主要得益于其独特的设计理念和卓越的性能。作为一个列式存储的数据库,ClickHouse以列的方式存储数据,而不是传统的行式存储。这种设计使得ClickHouse能够在大规模数据分析场景下提供更高的查询性能和更好的压缩率。同时,ClickHouse还采用了并行处理和向量化查询等技术,以进一步提升查询性能。
随着时间的推移,ClickHouse的用户和社区不断增长,越来越多的公司和组织开始选择ClickHouse作为他们的数据分析和查询引擎。ClickHouse也在不断发展和改进,增加了更多的功能和特性,以满足不同用户的需求。
ClickHouse是一个高性能、可扩展和可靠的列式数据库管理系统,它在大规模数据分析和实时查询方面具有显著的优势。它的诞生和发展得益于Yandex的需求和开源社区的贡献,成为了一个备受关注和广泛应用的开源项目。
2、Clickhouse 投影是什么
在ClickHouse中,投影(Projection)是指对表的列进行预先计算和存储的过程。它类似于其他数据库中的索引,但在ClickHouse中更加灵活和强大。
投影的作用是为了加速查询操作。当查询涉及到大量的列或者需要进行复杂的计算时,ClickHouse可以利用预先计算的投影数据来提高查询性能。通过预先计算和存储列的值,ClickHouse可以避免在每次查询时重新计算这些值,从而减少查询的时间和资源消耗。
投影可以分为两种类型:普通投影和合并树投影。
🎄 普通投影(Ordinary Projection):普通投影是最常见的类型,它会为表的每个分区创建一个独立的投影。每个分区的投影都包含了该分区中所有列的预先计算值。当查询只涉及到某个特定分区时,ClickHouse可以直接使用该分区的投影数据进行查询,而无需扫描整个表。
🎄 合并树投影(Merging Tree Projection):合并树投影是一种更高级的投影类型,它可以跨多个分区对列进行预先计算和存储。合并树投影通过将多个分区的投影数据合并为一个更大的投影树来实现。这样,当查询涉及到多个分区时,ClickHouse可以利用合并树投影的数据进行查询,而无需扫描所有的分区。
通过使用投影,ClickHouse可以显著提高查询性能,并减少查询所需的时间和资源消耗。但是,投影的创建和维护需要一定的成本,因此需要根据具体的使用场景和需求来决定是否使用投影以及选择何种类型的投影。
3、投影的优缺点
投影(Projection)在数据库中的使用具有一些优点和缺点。下面是投影的一些优点和缺点:
优点:
🎄提高查询性能:通过预先计算和存储列的值,投影可以避免在每次查询时重新计算这些值,从而减少查询的时间和资源消耗。这可以显著提高查询性能,特别是在大规模数据和复杂查询的情况下。
🎄减少数据传输量:投影可以只选择性地包含查询所需的列,从而减少从数据库到应用程序的数据传输量。这可以降低网络延迟和带宽消耗,提高数据访问效率。
🎄优化存储布局:投影可以根据查询的需求重新组织和存储数据,以提高数据的访问效率。例如,可以将相关的列存储在一起,减少磁盘IO和内存访问的次数。
🎄支持复杂查询:通过使用合适的投影类型,可以预先计算和存储复杂查询所需的中间结果,从而简化查询的逻辑和计算过程。这可以提高查询的可读性和可维护性。
缺点:
🎄额外的存储开销:投影需要占用额外的存储空间来存储预先计算的列值。这会增加数据库的存储需求,并可能导致额外的存储成本。
🎄数据更新的复杂性:当原始数据发生变化时,投影数据也需要相应地进行更新。这需要额外的开销和处理逻辑,特别是在频繁更新的情况下。
🎄增加数据写入延迟:由于需要同时更新原始数据和投影数据,写入操作可能会变得更加复杂和耗时。这可能导致增加数据写入的延迟。
🎄可能存在数据不一致性:如果在更新原始数据和投影数据之间发生故障或错误,可能会导致数据不一致的情况出现。这需要进行适当的错误处理和数据一致性保证。
综上所述,投影在提高查询性能和优化数据访问方面具有明显的优势,但也需要考虑额外的存储开销和数据更新的复杂性。在决定是否使用投影时,需要根据具体的使用场景和需求进行权衡和评估。
4、投影如何使用
如何创建投影,以下是官方给的一个案例:
CREATE TABLE visits
(
`user_id` UInt64,
`user_name` String,
`pages_visited` Nullable(Float64),
`user_agent` String,
PROJECTION projection_visits_by_user
(
SELECT
user_agent,
sum(pages_visited)
GROUP BY user_id, user_agent
)
)
ENGINE = MergeTree()
ORDER BY user_agent
🎄 1、增加投影
ALTER TABLE [db.]name [ON CLUSTER cluster] ADD PROJECTION [IF NOT EXISTS] name ( SELECT [GROUP BY] [ORDER BY] )
🎄 2、删除投影
ALTER TABLE [db.]name [ON CLUSTER cluster] DROP PROJECTION [IF EXISTS] name
🎄 3、创建投影
ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name]
🎄 4、物化投影
ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name]
更详细的可以去官网学习一下:clickhouse.com/docs/en/sql…
5、投影的原理
在ClickHouse中,通过投影可以加速查询。以下是通过投影快速查询的一般步骤:
🎄创建投影:使用ALTER TABLE语句为表创建投影。投影是根据表的结构和数据自动生成的,包含了查询常用的列和聚合信息。
🎄执行查询:使用SELECT语句执行查询操作。在查询中,ClickHouse会自动选择并使用最适合的投影来加速查询。
🎄列裁剪:投影数据只包含查询所需的列,而不是整个表的所有列。这样可以减少磁盘I/O和内存消耗,提高查询性能。
🎄数据预聚合:投影数据中已经预先计算了一些聚合信息,如最小值、最大值、总和等。查询时可以直接使用这些预计算的聚合结果,而不需要重新计算。
🎄利用索引:ClickHouse还支持使用索引来加速查询。在查询时,ClickHouse会自动选择并使用最适合的索引。
通过使用投影和其他优化技术,ClickHouse可以在查询时快速定位和读取所需的数据,减少磁盘I/O和CPU计算量,从而提高查询性能。
写在最后
在大数据场景下,无论什么方式,都离不开守恒定律,要查询快,就只能 “空间换时间”。
💕💕 本文由激流原创,原创不易,希望大家关注、点赞、收藏,给博主一点鼓励,感谢!!!
🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃🎃