ClickHouse 高性能實時分析數據庫-索引與數據跳過(查詢的“瞬移”能力)

告別等待,秒級響應!這不只是教程,這是你駕馭PB級數據的超能力!我的ClickHouse視頻課,凝練十年實戰精華,從入門到精通,從單機到集群。點開它,讓數據處理速度快到飛起,讓你的職業生涯從此開掛!

全套視頻教程聯系博主?:試聽視頻位置

主鍵索引 (稀疏索引) 的工作原理

  1. 核心概念:稀疏索引 (Sparse Index)

與 MySQL 等數據庫為每一行數據都建立索引(密集索引)不同,ClickHouse 的主鍵索引是稀疏的。它只為每個數據顆粒(Granule)的第一行記錄一個“路標”。

  • 數據顆粒 (Granule):ClickHouse 在存儲數據時,會將表中的行分批打包,一個包就是一個 Granule。默認情況下,一個 Granule 包含 8192 行。

  • 索引文件 (primary.idx):這個文件非常小,因為它只存儲每個 Granule 的“路標”值。例如,如果 ORDER BY(event_date),那么索引文件里存的就是每個 Granule 的起始日期。

圖示

?

  1. 查詢來了WHERE event_date = '2023-10-03'

  2. 掃描索引:ClickHouse 快速掃描內存中的 primary.idx 文件。

  3. 定位范圍:它發現 '2023-10-03' 這個值介于路標2 ('2023-10-03') 和路標3 ('2023-10-05') 之間。這意味著,目標數據 只可能存在于 Granule 2 中

  4. 精確打擊:ClickHouse 直接跳過 Granule 1 和 Granule 3,只從磁盤讀取 Granule 2 這一個數據塊進行處理。

結論:稀疏索引的威力在于大幅減少 I/O。它不關心數據具體在哪一行,只關心數據在哪一個數據塊范圍內。

主鍵索引的設計要點:

  • 列的選擇ORDER BY 的列應該是你 WHERE 子句中最常用的過濾條件,尤其是范圍查詢(>, <, BETWEEN)。

  • 列的順序:把基數更高(篩選能力更強)的列放在前面。例如 ORDER BY (event_date, user_id) 就比 ORDER BY (user_id, event_date) 要好,因為日期能先過濾掉大量不相關的數據塊。

我們再強調一次:ClickHouse 的主鍵索引是稀疏的。它不像 MySQL 那樣為每一行都建索引。它只為每個數據顆粒(Granule,默認8192行) 的第一行建立一條索引記錄。

優點:索引文件非常小,可以常駐內存。 工作方式:查詢時,ClickHouse 在內存中快速掃描索引,定位到可能包含目標數據的 Granule 范圍,然后只把這些 Granule 從磁盤加載到內存中進行精確匹配。

【實踐】: 為表添加跳數索引

給剛才的 user_behavior 表的 url 列添加一個布隆過濾器索引,以加速特定URL的查找。

-- 在建表時添加
CREATE TABLE user_behavior_with_index (-- ... 其他列定義和上面一樣 ...url                 String,-- ...INDEX idx_url url TYPE bloom_filter() GRANULARITY 1 -- GRANULARITY表示索引的粒度
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, event_type, user_id);-- 查詢時,ClickHouse會自動使用該索引
-- 這個查詢會因為idx_url索引而變得更快
SELECT count()
FROM user_behavior_with_index
WHERE url = 'https://clickhouse.com/docs/en/';

?數據跳過索引 (Skipping Indexes)-Granule 的“智能標簽”

如果說主鍵索引是城市間的高速公路,那么數據跳過索引就是每個高速出口旁邊的信息指示牌。它告訴你這個出口下去的區域“有什么”和“沒有什么”,幫你決定是否要下高速。

數據跳過索引是附加在每個數據顆粒 (Granule) 上的元數據。它獨立于主鍵索引,用于對非主鍵列進行預過濾。

除了主鍵,ClickHouse 還提供了額外的“跳數索引”,它們像給數據顆粒貼上的“標簽”,進一步減少需要掃描的數據量。

  • minmax: 記錄每個顆粒內某列的最大最小值。如果查詢 WHERE price > 500,而某個顆粒的 minmax 標簽是 [100, 400],則可以直接跳過。

  • set(N): 記錄每個顆粒內某列的前N個唯一值。如果查詢 WHERE color = 'Red',而某個顆粒的 set 標簽是 {'Blue', 'Green'},則可以跳過。

  • bloom_filter: 一種概率性索引。如果你查詢 WHERE has(urls, 'some_rare_url'),布隆過濾器可以快速告訴你“這個顆粒絕對沒有這個URL”,從而跳過。它可能會誤報(說有但實際沒有),但絕不會漏報。

① minmax
  • 作用:記錄每個 Granule 中某一列的最小值和最大值。

  • 場景:非常適合數值或日期類型。

  • 原理:查詢 WHERE price > 1000。如果某個 Granule 的 minmax 標簽是 [100, 900],ClickHouse 就知道這個 Granule 內所有 price 都小于等于900,不可能滿足條件,于是直接跳過。

?

圖解:查詢 price > 1000 時,Granule 1 被直接跳過,因為它的最大值 900 都不滿足條件。Granule 2 和 Granule 3 因為范圍有交集,所以需要被讀取。

② set(N)
  • 作用:記錄每個 Granule 中某列的前 N 個唯一值

  • 場景:適合基數較低的 StringEnum 列,用于等值查詢。

  • 原理:查詢 WHERE city = 'Shanghai'。如果某個 Granule 的 set(3) 標簽是 {'Beijing', 'Guangzhou', 'Shenzhen'},ClickHouse 就知道這個 Granule 里根本沒有 'Shanghai',直接跳過。

③ bloom_filter
  • 作用:一種概率性數據結構,可以非常確定地判斷一個元素“絕對不存在”,但只能概率性地判斷“可能存在”

  • 場景

    • 高基數的 String 列(如 URL,用戶ID)。

    • 檢查數組中是否包含某個元素 has(array, 'value')

    • 檢查 Map 中是否存在某個鍵 mapContains(map, 'key')

  • 原理:它像一個“黑名單篩選器”。數據寫入時,把 Granule 里的值都扔進布隆過濾器。查詢時,先問布隆過濾器:“這個值在你的黑名單上嗎?”

    • 如果回答“不在”(即絕對不存在),則安全跳過

    • 如果回答“可能在”(有可能是誤報),則需要讀取 Granule 進一步確認

?

圖解:查詢 'e.com' 時,布隆過濾器 1 準確地告訴我們 Granule 1 中沒有,從而避免了一次 I/O。布隆過濾器 2 提示可能存在,我們就需要去讀取 Granule 2 來做最終的判斷。

【實踐】: 為表添加跳數索引

?

CREATE TABLE access_logs (event_time  DateTime,request_id  String,http_code   UInt16,url         String
) ENGINE = MergeTree()
ORDER BY (event_time)
SETTINGS index_granularity = 8192; -- 明確指定顆粒大小-- 為 request_id 和 http_code 添加跳數索引
ALTER TABLE access_logs ADD INDEX idx_req_id request_id TYPE bloom_filter() GRANULARITY 4;
ALTER TABLE access_logs ADD INDEX idx_code http_code TYPE set(0) GRANULARITY 4;

GRANULARITY 4:表示這個跳數索引的粒度是主索引的 4 倍。即每 4 * 8192 行數據,才生成一個跳數索引塊。這是一種在索引精度和大小之間的權衡。

2. 驗證索引是否生效: 使用 EXPLAIN 或查詢日志 system.query_log 是最好的方法。我們用一個更直觀的方式:trace_logging

-- 執行帶 trace_logging 的查詢
SELECT count()
FROM access_logs
WHERE request_id = 'some-very-specific-request-id-abcdef'
SETTINGS log_queries=1; -- 確保查詢被記錄-- 在執行查詢后,立刻查看日志
-- 在 clickhouse-server.log 文件中,或者在 system.query_log 表中查找
-- 你會看到類似這樣的日志:
/*
<Trace> MergeTree(Reading): Mark ranges: [0, 1]
<Trace> MergeTree(Reading): Selected 1/100 parts by partition key
<Trace> MergeTree(Reading): Selected 1/50 ranges by primary key
<Trace> MergeTree(Reading): Selected 5/20 granules by skipping indexes -- 關鍵!
*/

日志中的 Selected ... granules by skipping indexes 明確告訴你,數據跳過索引生效了!它幫助 ClickHouse 在主鍵篩選之后,又進一步排除了更多的 Granule。

總結與最佳實踐

  1. 主鍵索引是基石ORDER BY 決定了數據的大方向,是性能優化的第一道防線。

  2. 跳數索引是精細化武器:它在主鍵索引篩選后的“候選范圍”內,進行二次精準打擊,進一步減少 I/O。

  3. 按需索驥:不要濫用索引!每個索引都會在寫入時帶來額外的計算開銷,并占用存儲空間。只為那些真正能大幅縮小查詢范圍的列創建索引。

  4. 如何選擇?

    1. 數值/日期范圍查詢 -> minmax

    2. 低基數 String/Enum 等值查詢 -> set

    3. 高基數 String 等值查詢或 has() / mapContains() -> bloom_filter

掌握了主鍵索引和數據跳過索引的組合拳,你就掌握了開啟 ClickHouse 極致性能的鑰匙。現在,去鍛造你自己的“神兵利器”吧!

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

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

相關文章

Jetpack - Room(Room 引入、Room 優化)

一、Room 引入 1、基本介紹 Room 在 SQLite 上提供了一個抽象層&#xff0c;以便在充分利用 SQLite 的強大功能的同時&#xff0c;能夠流暢地訪問數據庫&#xff0c;官方強烈建議使用 Room 而不是 SQLite 2、演示 &#xff08;1&#xff09;Setting 模塊級 build.gradle depend…

【江科大CAN】2.1 STM32 CAN外設(上)

2.1 STM32 CAN外設&#xff08;上&#xff09;2.1.1 STM32 CAN外設簡介2.1.2 外圍電路設計2.1.3 STM32 CAN內部結構2.1.4 發送流程詳解2.1.5 接收流程詳解2.1.6 關鍵配置位總結STM32 CAN外設講解 大家好&#xff0c;歡迎繼續觀看CAN總線入門教程。本節開始&#xff0c;我們正式…

人工智能技術革命:AI工具與大模型如何重塑開發者工作模式與行業格局

引言&#xff1a;AI技術爆發的時代背景過去五年間&#xff0c;人工智能領域經歷了前所未有的爆發式增長。從2020年GPT-3的橫空出世到2023年多模態大模型的全面突破&#xff0c;AI技術已經從實驗室走向了產業應用的前沿。開發者作為技術生態的核心推動者&#xff0c;其工作模式正…

傅里葉變換

傅里葉變換:運用頻域的出發點就是能夠將波形從時域變換到頻域&#xff0c;用傅里葉變換可以做到這一點。有如下3種傅里葉變換類型&#xff1a;1.傅里葉積分(FI); 2.離散傅里葉變換(DFT); 3.快速傅里葉變換(FFT)。傅里葉積分是一種將時域的理想數學表達變換成頻域描述的數學技術…

【IQA技術專題】紋理相似度圖像評價指標DISTS

紋理一致性圖像評價指標: Image Quality Assessment: Unifying Structure and Texture Similarity&#xff08;2020 PAMI&#xff09;專題介紹一、研究背景二、方法總覽2.1 初始變換2.2 紋理表示和結構表示2.3 DISTS指標2.4 優化DISTS指標三、實驗結果四、總結本文將對統一圖像…

windows下Docker安裝路徑、存儲路徑修改

一、命令行指定安裝路徑? ??下載安裝包??&#xff1a;從Docker官網獲取安裝程序&#xff08;如Docker Desktop Installer.exe&#xff09;。??運行PowerShell??&#xff1a; & "H:\Docker Desktop Installer.exe" install --installation-dir"F:…

thingsboard 自定義動作JS編程

在 ThingsBoard 中實現 自定義動作&#xff08;Custom Action&#xff09;的 JavaScript 編程&#xff0c;主要通過“Custom action (with HTML template&#xff09;”方式完成&#xff0c;適用于創建彈窗、編輯實體、控制設備等交互行為。 實現步驟&#xff08;以添加設備或資…

Spring Boot 簡單接口角色授權檢查實現

一、背景與目標在Spring Boot應用開發中&#xff0c;接口級別的權限控制是系統安全的重要組成部分。本文將介紹一種簡單直接的接口角色授權檢查實現方案&#xff0c;適合快速開發和安全合規檢查場景。二、技術方案概述本方案采用自定義注解攔截器的方式實現&#xff0c;具有以下…

PytorchLightning最佳實踐日志篇

在 PyTorch Lightning&#xff08;PL&#xff09;中&#xff0c;日志系統是 “煉丹” 過程中復現實驗、對比效果、排查問題的核心工具。結合實際工程經驗&#xff0c;總結以下最佳實踐和技巧&#xff0c;幫助提升實驗效率&#xff1a; 一、日志工具的選擇與配置 PL 通過統一的s…

基于JavaWeb的兼職發布平臺的設計與實現

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7數據庫工具&#xff1a;Navicat12開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.6系統展示系統首頁用戶登錄招聘信…

Linux學習--C語言(指針3)

1.指針函數和函數指針1.1 指針函數指針函數是函數&#xff0c;函數的返回值是指針不能返回局部變量的地址指針函數返回的地址可以作為下一個函數調用的參數1.2 函數指針函數指針是指針&#xff0c;指針指向一個函數#include <stdio.h>int Add(int x, int y) {return x y…

【JAVA EE初階】多線程(上)

目錄 1.預備知識 1.1 馮諾依曼體系結構&#xff1a; 1.2 現代CPU主要關心指標&#xff08;和日常開發密切相關的&#xff09; 1.3 計算機中&#xff0c;一個漢字占幾個字節&#xff1f; 1.4 Windows和Linux的區別 1.5 PCB的一些關鍵要點 2.線程和進程 2.1 創建線程的寫法…

用互聯網思維擴展電商后臺的 CRUD 功能

一、自定義實現MyBatis-Plus逆向工程 多數據源的問題解決了&#xff0c;接下來開始進行實際開發時&#xff0c;你會發現&#xff0c;最麻煩的一件事情就是要創建與數據庫表對應的POJO了。這些沒什么難度&#xff0c;但是繁瑣的內容會占據大量的開發時間。比如一個PmsProducr對…

無代碼測試平臺ATECLOUD全場景測試方案

ATECLOUD 智能云測試平臺是有納米軟件開發的一款以無代碼架構與彈性擴展體系為核心的自動化測試平臺&#xff0c;通過數據模型驅動的創新設計&#xff0c;為研發、產線等多場景提供高效可控的測試解決方案。?無代碼架構 ATECLOUD 打破傳統技術壁壘&#xff0c;構建完全可視化的…

當 AI 重構審計流程,CISA 認證為何成為破局關鍵

在南京審計大學最新發布的《面向審計行業 DeepSeek 大模型操作指南》中&#xff0c;一組數據引發行業深思&#xff1a;通過自動化數據處理、智能風險識別和定制化報告生成&#xff0c;AI 大模型能幫助審計人員降低 40% 以上的人工成本&#xff0c;同時將風險識別準確率提升至 9…

NAT技術、代理服務器

NAT/NAPT技術NAT的全稱是network address translation&#xff0c;網絡地址轉換。NAT 能在對外通信時夠將源 IP 轉為新源 IP&#xff0c;對內通信時將目的ip轉換成新目的ip&#xff0c;實現這個操作&#xff0c;靠的是地址轉換表但NAT的說法其實是不準確的&#xff0c;因為多個…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-45,(知識點:負反饋的作用,基礎理解,干擾和噪聲的抑制)

目錄 1、題目 2、解答 步驟一&#xff1a;明確負反饋的作用原理 步驟二&#xff1a;逐一分析選項 3、相關知識點 一、負反饋的基本原理 二、負反饋對干擾和噪聲的抑制機制 三、選項分析與答案 四、擴展思考&#xff1a;如何抑制不同位置的干擾&#xff1f; 總結 題目…

Flutter藍牙BLE開發完全指南(內含高級功能擴展)

Flutter藍牙BLE開發完全指南 我將為您提供一個完整的Flutter藍牙BLE實現方案,包含UI設計、權限處理、設備掃描、連接通信等完整功能。 完整實現方案 1. 添加依賴與權限配置 pubspec.yaml dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler…

使用 Canvas 替代 <video> 標簽加載并渲染視頻

在部分瀏覽器環境或業務場景下&#xff0c;直接使用 <video> 標簽加載視頻會出現首幀延遲的情況。以下方法通過 WebGPU Canvas 2D 將視頻幀繪制到自定義 Canvas 上&#xff0c;讓 <video> 只做解碼&#xff0c;WebGPU 接管渲染&#xff0c;通過最小化對象創建 精…

基于Flask的智能停車場管理系統開發實踐

在現代城市中&#xff0c;停車難已成為一個普遍問題。為了解決這一問題&#xff0c;我開發了一個基于Python Flask框架的智能停車場管理系統。該系統集成了車牌識別、車位狀態監控、收費管理等多項功能&#xff0c;為停車場的智能化管理提供了完整的解決方案。系統功能概述該停…