ClickHouse MergeTree引擎:從核心架構到三級索引實戰

摘要

????????MergeTree是ClickHouse最核心的存儲引擎,采用列式存儲+LSM-Tree架構設計,支持高效的數據寫入、合并和查詢。本文將全面解析MergeTree引擎的基礎概念、數據流、核心架構、索引系統以及常見問題。

基礎篇:

一、MergeTree引擎基礎概念

1. 定義

MergeTree是ClickHouse中最高性能的存儲引擎,專為大規模數據分析場景設計,具有以下核心特性:

特性分類

詳細說明

技術價值

?列式存儲結構?

數據按列而非按行存儲,每列獨立壓縮

提升壓縮率5-10倍,減少I/O消耗70%+

?主鍵索引?

稀疏索引設計(默認8192行粒度),支持ORDER BY鍵快速定位

使范圍查詢效率提升100倍+

?自動數據分區?

按PARTITION BY表達式自動劃分數據目錄

實現分區裁剪,減少90%+無關數據掃描

?后臺合并機制?

異步合并小Parts為優化后的大Part(LSM-Tree架構)

寫入吞吐量可達50MB/s,查詢性能提升300%

?衍生引擎變種?

包括Replacing/Summing/Aggregating等7種變體

覆蓋去重、預聚合等專項場景需求

2. 引擎家族圖譜

引擎類型

主要變種

核心特性

基礎變種

ReplacingMergeTree

支持數據去重

基礎變種

SummingMergeTree

預聚合計算

基礎變種

AggregatingMergeTree

高級聚合功能

分布式變種

ReplicatedMergeTree

支持數據副本

分布式變種

Distributed

分片集群支持

二、核心架構與數據流

1. 存儲架構分層圖?

?關鍵說明?:

  • 分區(Partition)是數據物理隔離的最小單位,按分區鍵自動裁剪
  • 每個Part包含列文件、標記文件和主鍵索引三要素
  • 跳數索引通過minmax/set等算法加速查詢

2. 數據寫入時序圖?

?關鍵說明?:

  • 采用兩階段提交保證分布式一致性
  • 臨時Part經后臺合并轉為正式Part
  • 元數據變更通過ZooKeeper同步

3. 后臺合并流程時序圖?

?

關鍵說明?:

  • 合并策略基于Part大小/數量自動觸發
  • 合并過程產生新Part并原子替換舊Part
  • 后臺線程默認10分鐘執行一次

4. 數據查詢時序圖?

?

關鍵說明?:

  • 查詢采用MPP并行處理模式
  • 跳數索引實現"預過濾"優化
  • 列存儲實現按需讀取

三、索引解析:三級索引協同工作原理?

?1. 三級索引體系架構圖?

?2. 索引功能對照表?

?索引類型?

?物理結構?

?觸發條件?

?優化效果?

?項目案例?

?一級索引?

內存中的稀疏索引

WHERE涉及PRIMARY KEY

減少99%數據掃描

用戶畫像查詢從12s→0.3s

?分區索引?

分區目錄元數據

WHERE涉及PARTITION BY列

大表查詢速度提升8-10倍

日志分析按day分區后QPS提升430%

?跳數索引?

Granule級元數據

WHERE涉及普通列

減少I/O 30-70%(取決于索引類型)?

商品搜索使用布隆過濾器降低60%IO

?3. 協同工作深度解析?

?階段一:分區裁剪(Partition Pruning)?

# 分區表達式示例
partition_expr = "toYYYYMMDD(event_time)"
# 查詢優化器自動轉換為分區范圍
WHERE event_time > '2023-01-01' 
→ 轉換為分區ID范圍:20230101 ≤ partition_id ≤ 20231231

?階段二:主鍵定位(Primary Key Lookup)?

// ClickHouse內核處理流程
1.WHERE user_id=123轉為Mark Range(區間標記)
2. 通過稀疏索引定位到Granule(數據塊) 42(假設每8192行一個Mark)
3. 僅加載對應Granule的列文件(.bin)

?階段三:跳數索引過濾(Skipping Index Filter)?

?索引類型?

?適用場景?

?項目配置?

?性能收益?

minmax(極值索引)

數值范圍查詢

INDEX idx_price TYPE minmax GRANULARITY 3

減少45%讀取量

bloom_filter布隆過濾器)

IN/等值查詢

INDEX idx_sku TYPE bloom_filter(0.025)

降低60%CPU開銷

實戰篇:

?四數據更新與刪除策略深度解析

1. 核心設計理念

????????ClickHouse采用LSM-Tree架構,其數據變更處理遵循"追加寫入+后臺合并"原則。與傳統OLTP數據庫不同,ClickHouse原生設計更側重高性能分析而非高頻單行變更,這導致其UPDATE/DELETE實現具有顯著特殊性。

2. 實現原理

變更類型

實現方案

核心機制

適用場景

?

刪除?

狀態標記法

增加_is_deleted字段(0/1)

需要保留歷史記錄的刪除

墓碑標記法

增加_sign字段(1/-1)

VersionedCollapsing場景

輕量級刪除

22.8+版本ALTER TABLE DELETE語法

物理刪除需求

?

更新?

版本覆蓋法

ReplacingMergeTree+_version字段

通用更新場景

聚合更新法

AggregatingMergeTree+狀態函數

指標類數據更新

增量合并法

CollapsingMergeTree+_sign字段

狀態變更類更新

3. 技術實現方案案例

?場景?:電商商品數據實時新增/更新

實時管道最佳實踐:

mysql binlog  Kafka → Flink實時ETL → ODS → DWD層物化視圖)

????????物化視圖通過預計算和自動更新機制,顯著提升大數據分析查詢性能,博客《ClickHouse物化視圖避坑指南:原理、數據遷移與優化》

clickhouse中的腳本如下:

-- 1. 基礎存儲層(全量快照)
CREATE TABLE ods.products_snapshot
(product_id UInt64,product_name String,price Decimal(18,2),category_id UInt32,update_time DateTime,_version UInt64 MATERIALIZED toUnixTimestamp(update_time)
)
ENGINE = MergeTree()
ORDER BY (product_id);-- 2. DWD層(版本化視圖)
CREATE MATERIALIZED VIEW dwd.products
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/dwd_products', '{replica}', _version)
ORDER BY product_id
AS SELECTproduct_id,argMax(product_name, update_time) as product_name,argMax(price, update_time) as price,argMax(category_id, update_time) as category_id,max(update_time) as update_time,max(_version) as _version
FROM ods.products_snapshot
GROUP BY product_id;-- 3. 基礎查詢(獲取最新商品版本)
SELECT product_id,product_name,price,category_id
FROM dwd.products FINAL
WHERE product_id = 123;

核心技術函數說明表

函數類別

關鍵函數

功能說明

?狀態函數?

argMax/argMin

保留指定字段最新/最舊值

?版本控制?

toUnixTimestamp(now())

生成版本號

?特殊引擎?

ReplacingMergeTree

按版本自動去重

五、常見問題

1. 架構設計常見問題

  • 如何選擇排序鍵?推薦采用(ad_id, event_time)等雙字段組合鍵
    • 優先選擇低基數且高頻過濾的字段
    • 避免過度使用Nullable類型?
  • 物化視圖如何優化?
    • 配合物化視圖可實現毫秒級分析?
    • 建議按業務場景設計專用物化視圖

2. 性能優化問題

  • 分區策略優化:
    • 設置分區TTL可自動清理舊數據
    • 控制分區粒度在1-10GB/分區
  • 索引優化:
    • 跳數索引可使查詢性能提升
    • 合理設置max_parts_in_total參數?

3. 工程實踐問題

  • 數據分層設計:
    • 通過DWD/DWS分層可降低查詢復雜度
    • 建議基于原始底表構建輕聚合明細層(DWD)與指標服務層(DWS)
  • 高并發支撐:
    • 分布式物化視圖集群可支撐5000+ QPS高并發查詢?
    • 需考慮查詢路由和負載均衡策略

六、總結

????????MergeTree引擎通過分層架構實現高性能分析:存儲層(列文件+分區)保障數據壓縮與局部性,計算層(稀疏索引+跳數索引)實現查詢加速,管理層(ZooKeeper協調)確保分布式一致性。這種"寫入即合并"的LSM-Tree設計,配合物化視圖等衍生能力,使其在OLAP場景實現吞吐量與查詢效率的完美平衡。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91679.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91679.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91679.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電腦手機熱點方式通信(上)

電腦連接手機熱點時的無線鏈路情況: 電腦上網時(從服務器下載數據,或者上傳指令、數據),首先電腦與手機之間基于WiFi協議在2.4G頻段或者5G頻段通信,然后手機與基站之間再基于4G LTE或者5G NR協議在2412MHz…

MySQL CPU占用過高排查指南

MySQL CPU 占用過高時,排查具體占用資源的表需結合系統監控、數據庫分析工具和 SQL 診斷命令。🔍 ?一、快速定位問題根源??確認 MySQL 進程占用 CPU?使用 top 或 htop 命令查看系統進程,確認是否為 mysqld 進程導致 CPU 飆升。若 MySQL 進…

軟件交付終極閘口:驗收測試全解析

驗收測試:軟件交付的關鍵環節 目錄 驗收測試:軟件交付的關鍵環節 一、驗收測試:軟件交付的終極閘口 核心目標與作用 在 SDLC 中的位置 二、驗收測試類型詳解:精準匹配業務場景 三、驗收測試全流程解析:從計劃到…

深度學習核心:卷積神經網絡 - 原理、實現及在醫學影像領域的應用

🧑 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C, C#,Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C、C#等開發語言,熟悉Java常用開發…

多線程(二) ~ 線程核心屬性與狀態

文章目錄一. 線程創建(start)(一)繼承Thread類,重寫run(二)繼承Runnable類,重寫run(三)Thread匿名內部類重寫(四)Runnable匿名內部類重…

Linux---編輯器vim

一、vim的基本概念1.三種模式①命令模式控制屏幕光標的移動,字符、字或行的刪除,移動復制某區段及進入插入模式或者進去底行模式②插入模式可進行文本輸入,按Esc回到命令行模式③底行模式文件保存或退出,也可以進行文件替換&#…

如何在 Ubuntu 24.04 或 22.04 LTS Linux 上安裝 Guake 終端應用程序

通過本教程的簡單步驟,在 Ubuntu 24.04 或 22.04 LTS Jammy JellyFish 上安裝 Guake 終端以運行命令。 Guake(基于 Quake)是一個基于 Python 的終端模擬器。Guake 的行為類似于 Quake 中的終端:通過某個按鍵(熱鍵)按下時,窗口會從屏幕頂部滾下來,再次按下相同的按鍵時…

谷歌Gemini 2.5重磅應用:多模態研究助手Multi-Modal Researcher,實現全網自動研究與AI播客生成

在人工智能賦能科研與內容創作的浪潮中,谷歌基于其最新大模型 Gemini 2.5 推出了突破性工具 Multi-Modal Researcher。這一系統通過整合多模態數據(文本、視頻、實時網絡信息),實現了從自動研究到內容生成的全流程自動化。用戶只需輸入研究主題或YouTube視頻鏈接,系統即可…

防御綜合實驗

一、實驗拓補圖二、實驗需求及配置需求一設備接口VLAN接口類型SW2GE0/0/2VLAN 10AccessGE0/0/3VLAN 20AccessGE0/0/1VLAN List : 10 20Trunk[SW2]vlan 10 [SW2]vlan 20 [SW2]interface GigabitEthernet 0/0/2 [SW2-GigabitEthernet0/0/2]port link-type access [SW2-GigabitEt…

堆----2.前 K 個高頻元素

347. 前 K 個高頻元素 - 力扣(LeetCode) /** 桶排序: 首先遍歷數組,使用HashMap統計每個元素出現的次數 創建一個大小為length 1的List數組,下標代表元素出現次數,出現次數一致的元素放在同一個數組中 倒數遍歷List數組即可得得到前K個高頻元素 細節注…

如何分析Linux內存性能問題

一、Linux中的buffer與cache的區別 Linux的內存管理與監控_linux服務器虛假內存和真實內存怎么區分-CSDN博客文章瀏覽閱讀66次。本文主要是關于【Linux系統的物理內存與虛擬內存講解】【重點對虛擬內存的作用與用法進行了講解說明】【最后還對如何新增擴展、優化、刪除內存交換…

二次型 線性代數

知識結構總覽首先是我們的二次型的定義,就是說什么樣的才算是一個二次型。然后就是如何把二次型化為標準型,最后就是正定二次型的定義和判斷的一些條件。二次型的定義二次型其實是一種函數表達的方式,如上,含義其實就是每個項都是…

云原生三劍客:Kubernetes + Docker + Spring Cloud 實戰指南與深度整合

在當今微服務架構主導的時代,容器化、編排與服務治理已成為構建彈性、可擴展應用的核心支柱。本文將深入探討如何將 Docker(容器化基石)、Kubernetes(編排引擎)與 Spring Cloud(微服務框架) 無縫…

vue讓elementUI和elementPlus標簽內屬性支持rem單位

vue讓elementUI和elementPlus標簽內屬性支持rem單位 如 Element Plus 的 el-table 默認不直接支持使用 rem 作為列寬單位 解決方法: 將 rem 轉換為像素值(基于根元素字體大小) // 計算rem對應的像素值 const calcRem (remValue) > {// 獲取根元素(ht…

基于OAuth2與JWT的微服務API安全實戰經驗分享

引言 在微服務架構中,API 安全成為了保護服務免受未授權訪問和攻擊的關鍵要素。本文結合真實生產環境案例,以實戰經驗為出發點,分享基于 OAuth2 JWT 的微服務 API 安全方案,從業務場景、技術選型、實現細節、踩坑及解決方案&…

scrapy庫進階一

scrapy 庫復習 scrapy的概念:Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架 scrapy框架的運行流程以及數據傳遞過程: 爬蟲中起始的url構造成request對象–>爬蟲中間件–>引擎–>調度器調度器把request–>引擎…

Objective-C實現iOS平臺微信步數修改指南

本文還有配套的精品資源,點擊獲取 簡介:本文介紹如何在iOS平臺上使用Objective-C語言,通過蘋果的HealthKit框架讀取和修改微信步數以及相關健康數據。首先介紹如何引入和使用HealthKit框架,包括請求權限、讀取步數數據、寫入步…

【ElementPlus】深入探索ElementPlus:前端界面的全能組件庫

📚 引言在現代 Web 開發中,創建既美觀又功能強大的用戶界面是一項挑戰。Element Plus,作為 Vue 3 生態中的明星 UI 組件庫,以其豐富的組件、優秀的性能和易用性贏得了廣大開發者的青睞。本文將全面覆蓋 Element Plus 的 常用核心組…

Json Jsoncpp

文章目錄Json 介紹Jsoncpp 介紹Json::Value序列化接口反序列化接口序列化操作反序列化操作Json 介紹 JSON(JavaScript Object Notation,JavaScript 對象表示法)是一種輕量級的數據交換格式,具有簡潔、易讀、跨平臺等特點&#xff…

openwrt下安裝istore(基于pve)

openwrt下安裝istore(基于pve)ssh連接到openwrt,用如下命令安裝istore:opkg update || exit 1cd /tmpwget https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/i…