【Clickhouse系列】索引

目錄

1. 主鍵索引 (Primary Key Index) - 核心是稀疏索引

2. 跳數索引 (Data Skipping Indexes) - 二級索引

3. 關鍵總結與最佳實踐:


ClickHouse的索引設計哲學與其他傳統OLTP數據庫(如MySQL)有顯著不同,它更側重于高效掃描大數據集快速過濾,而不是點查(Point Lookup)。其核心索引類型如下:

1. 主鍵索引 (Primary Key Index) - 核心是稀疏索引

    • 原理: 這是ClickHouse最核心的索引機制。它不是傳統意義上的B樹索引。
    • 數據結構: 本質上是一個稀疏索引。數據在物理存儲上嚴格地按照主鍵(或ORDER BY鍵,兩者在MergeTree引擎家族中概念等價)排序存儲。
    • 粒度: 索引并不是為每一行都建立條目,而是為每個數據部分的每個索引粒度(默認為8192行)記錄該粒度內第一行的主鍵值(稱為“標記”)。
    • 工作方式:
      • 當執行帶有WHERE條件的查詢(特別是涉及主鍵前綴或范圍條件)時,ClickHouse利用這些稀疏的標記值。
      • 它通過二分查找快速定位到可能包含目標數據的數據塊(即索引粒度對應的數據段)。
      • 然后,它只加載這些定位到的數據塊(.bin文件中的相應部分)到內存中進行掃描和過濾,避免了全表掃描
    • 優勢:
      • 內存占用小: 稀疏索引占用的內存遠小于稠密索引(如B樹)。
      • 范圍查詢極快: 對于按主鍵排序的范圍查詢(如時間范圍),效率極高,只需加載少量相關數據塊。
      • 高效過濾: 能有效利用主鍵前綴進行過濾。
    • 局限性:
      • 點查效率較低: 查找單行數據時,可能仍需加載一個完整的數據塊(8192行)進行掃描,不如B樹高效。ClickHouse不是為高頻點查設計的。
      • 依賴主鍵順序: 查詢條件必須有效利用主鍵(或ORDER BY鍵)的前綴才能發揮最大效果。如果查詢條件不涉及主鍵前綴,索引效果會大打折扣甚至無效。
      • 非唯一約束: 聲明主鍵強制唯一性約束,它只定義數據的物理排序順序和稀疏索引的構建依據。
    • 存儲位置: 索引標記存儲在內存中(primary.idx文件在磁盤上,啟動時加載到內存),查詢時進行二分查找速度很快。

2. 跳數索引 (Data Skipping Indexes) - 二級索引

    • 目的: 為了解決主鍵索引對非主鍵列(特別是高基數列或查詢條件不涉及主鍵前綴時)過濾效率低下的問題。
    • 原理: 在數據塊(索引粒度)級別上存儲關于該塊內數據的摘要信息(Min/Max, Bloom Filter, 集合等)。查詢時,先檢查這些摘要信息,如果確定某個數據塊內不可能包含滿足查詢條件的數據,則跳過整個數據塊的讀取。
    • 核心思想: 跳過不需要掃描的數據塊,減少IO和CPU消耗。
    • 類型: ClickHouse提供了多種跳數索引類型,適用于不同的數據類型和查詢模式:
      • minmax: 存儲每個數據塊中指定列的最小值和最大值。適用于數值、日期等有序類型。如果查詢條件范圍與某個塊的min-max范圍無重疊,則跳過該塊。最簡單高效,通常首選。
      • set: 存儲每個數據塊中指定列的所有唯一值(或一個固定大小的超集)。適用于低中基數列的IN=查詢。如果查詢值不在塊的set中,則跳過該塊。存儲開銷和構建成本隨基數增大而增加。
      • bloom_filter: 為每個數據塊中的指定列值構建一個布隆過濾器。適用于高基數列的IN=查詢,尤其是字符串。可以高效判斷某個值“可能不存在”于該塊(有一定誤判率,但“存在”判斷是準確的)。需要配置參數(false_positive概率)。
      • ngrambf_v1 / tokenbf_v1: 基于N-gram或分詞構建的布隆過濾器變種,專門優化字符串子串(LIKE, %term%分詞搜索的跳過。
      • experimental類型:hypothesis索引(基于統計假設檢驗)等,用于特定高級場景。
    • 創建:CREATE TABLEALTER TABLE語句中聲明。例如:
CREATE TABLE logs (timestamp DateTime,user_id UInt64,url String,...INDEX idx_user_id user_id TYPE set(100) GRANULARITY 4,INDEX idx_url_token url TYPE tokenbf_v1(32768, 3, 0) GRANULARITY 4
) ENGINE = MergeTree
ORDER BY (timestamp, user_id);
      • GRANULARITY: 指定索引的粒度(覆蓋多少個主鍵索引粒度)。GRANULARITY 1表示每個跳數索引條目對應一個主鍵索引粒度(8192行)。GRANULARITY 4表示一個跳數索引條目對應4個主鍵索引粒度(32768行)。更大的粒度可以減少索引大小但降低跳過精度。
    • 優勢:
      • 顯著加速對非主鍵列(尤其是高基數列)的過濾查詢。
      • 減少不必要的磁盤IO和CPU消耗。
    • 局限性:
      • 額外存儲和計算開銷: 需要存儲索引數據,并在寫入和合并時計算摘要信息。
      • 可能無效: 如果數據分布使得摘要信息無法有效跳過塊(例如所有塊的值范圍都很大且重疊),則索引效果差。
      • 布隆過濾器誤判: bloom_filter類型可能導致不必要的塊讀取(但不會漏讀)。
      • 粒度影響: GRANULARITY設置需要權衡索引大小和跳過精度。

3. 關鍵總結與最佳實踐:

  1. 主鍵索引是基石: 表設計時,ORDER BY子句(即主鍵)的選擇至關重要。優先選擇最常用作過濾條件(尤其是范圍過濾)的1-N個列。良好的主鍵設計能解決大部分高效查詢問題。
  2. 跳數索引是補充: 當查詢條件無法有效利用主鍵前綴或涉及高基數的非主鍵列時,考慮創建合適的跳數索引。
  3. 索引選擇:
    • 優先嘗試minmax(對有序類型)。
    • 對低基數的IN/=set
    • 對高基數的IN/=或字符串用bloom_filter
    • LIKE/子串搜索用ngrambf_v1/tokenbf_v1
  1. 評估與監控: 使用EXPLAIN indexes = 1查看查詢是否使用了索引以及跳過了多少數據塊。監控索引的存儲開銷和查詢性能提升是否成正比。
  2. 理解ClickHouse哲學: ClickHouse索引的目標是最小化需要從磁盤讀取的數據量,通過預排序(主鍵索引)數據塊摘要(跳數索引) 來實現。它不是為單行檢索優化,而是為海量數據分析的聚合和掃描優化。

總而言之,ClickHouse的索引機制是其高性能查詢的核心支撐之一。深刻理解主鍵(稀疏索引)和跳數索引的原理、適用場景以及局限性,是設計和優化ClickHouse表結構、編寫高效查詢的關鍵。

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

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

相關文章

445場周賽

第一題:檢查元素頻次是否為質數 給你一個整數數組 nums。 如果數組中任一元素的 頻次 是 質數,返回 true;否則,返回 false。 元素 x 的 頻次 是它在數組中出現的次數。 質數是一個大于 1 的自然數,并且只有兩個因數…

【SQL語法匯總】

讀音:MySQL —— 賣舌口 MySQL 實際上是DBMS軟件系統, 并非數據庫。通過系統管理維護數據庫,DBMS相當于用戶和數據庫之間的橋梁。 MySQL是一種關系型數據庫, 類似excel,用行和列的關系組織數據數據。 操作關系型數據庫的DBMS系統大多數用SQL來管理數據。 SQL是編程語言…

C++法則10:引用本身是一個“別名”(alias),一旦綁定到一個對象后,就不能再重新綁定到其他對象。

C法則10:引用本身是一個“別名”(alias),一旦綁定到一個對象后,就不能再重新綁定到其他對象。 在C中,引用(reference)是一個已存在對象的別名。一旦引用被初始化綁定到一個對象&…

PHP 生成當月日期

一:按日期順序排列的數組,而不是按周分組的二維數組 /*日期生成 *day: 日期數字 *date: 完整的日期字符串 (YYYY-MM-DD) *is_current_month: 是否屬于當前月份 *is_prev_month: 是否是上個月的日期 *is_next_month: 是否是下個月的日期 *is_today: 是否是…

vue3+elementPlus實現無縫滾動表格封裝

vue3+elementPlus+css+js 模擬liMarquee插件,實現無限滾動效果 功能:1、表格數據大于一定數量之后,開始向上滾動 2、當鼠標移入的時候,動畫停止,鼠標移出,繼續動畫 3、滾動動畫的速度可以自定義 4、表格的高度固定 5、向上滾動時,無限滾動,不存在卡頓 <template>…

AI賦能企業內訓:2025智能化教育培訓系統源碼開發全解析

從線下集中授課到線上碎片化學習&#xff0c;從被動灌輸到主動交互&#xff0c;越來越多企業開始關注“企業內訓系統”的智能化升級。而這一切的背后&#xff0c;離不開AI技術的深度賦能。 筆者認為&#xff0c;2025年將是企業內訓系統“從信息化走向智能化”的關鍵拐點。本篇…

旅游安全急救實訓室:構建旅游行業安全人才培養新范式

在文旅產業蓬勃發展與安全應急需求日益凸顯的背景下&#xff0c;旅游安全急救能力已成為從業者的核心素養之一。當前&#xff0c;旅游市場突發狀況頻發&#xff0c;如景區意外事故、游客突發疾病等&#xff0c;對從業人員的急救技能提出了更高要求——既要掌握基礎急救操作&…

網絡編程及原理(六):三次握手、四次揮手

目錄 一 . TCP 的核心機制&#xff1a;連接管理 二 . 三次握手&#xff1a;建立連接 &#xff08;1&#xff09; 三次握手的意義 &#xff08;1.1&#xff09;初步驗證通信鏈路是否流暢 &#xff08;1.2&#xff09;確認通信雙方各自的發送、接受能力是否正常 &…

【LLaMA 3實戰】2、LLaMA 3對話能力全解析:從架構革新到多智能體實戰指南

引言:LLaMA 3對話能力的革命性突破 當Meta發布LLaMA 3時,其對話能力的躍升重新定義了開源大模型的邊界。這款擁有128K上下文窗口的開源模型,不僅在MT-Bench評測中超越GPT-3.5,更通過分組查詢注意力(GQA)等架構創新,實現了推理速度30%的提升。 本文將從底層架構到應用實戰…

面試題-在ts中類型轉換的方法

在 TypeScript 中&#xff0c;類型轉換主要分為 類型斷言&#xff08;Type Assertion&#xff09;、類型守衛&#xff08;Type Guard&#xff09; 和 類型兼容轉換 三種方式。以下是詳細分類和示例&#xff1a; 一、類型斷言&#xff08;Type Assertion&#xff09; 強制編譯…

IIS配置SSL證書

公司的一個項目使用IIS部署的網站&#xff0c;現在需要更新SSL證書。為了下次方便&#xff0c;在此做記錄整理。 以下第一部分是查網絡AI查詢到的資料&#xff0c;解決了我心中對雙擊和從IIS導入有什么不同的疑惑。第二部分是我在這次實際操作過程中的截圖。 一.證書安裝方式 …

K8s初始化容器與邊車容器比對

Kubernetes 中的初始化容器和邊車容器 Kubernetes 作為一個開源容器編排平臺&#xff0c;引入了強大的概念來管理和增強 Pod 內容器的功能。其中兩個概念是初始化容器&#xff08;Init Containers&#xff09;和邊車容器&#xff08;Sidecar Containers&#xff09;。盡管這兩…

無線Debugger攻防全解:原理剖析與突破之道

引言?? 在Web安全防護體系中&#xff0c;反調試技術已成為對抗爬蟲和分析的關鍵武器。2023年OWASP報告顯示&#xff0c;Top 1000網站中92%部署了反調試機制&#xff0c;其中??無線Debugger技術??&#xff08;也稱為無限Debug&#xff09;因其難以破解的特性&#xff0c;…

Eslint自定義規則使用

文章目錄 前言場景設定&#xff1a;維護代碼分層&#xff0c;禁止“跨級調用”實現步驟&#xff1a;從零到一&#xff0c;創建你的第一條自定義規則**第 1 步&#xff1a;創建規則文件****第 2 步&#xff1a;在 eslint.config.mjs 中注冊并啟用你的規則** 驗證成果 前言 設計…

深入剖析Spring Cloud Gateway,自定義過濾器+斷言組合成攔截器鏈實現Token認證

一、Spring Cloud Gateway網關的整體架構 Spring Cloud Gateway 是 Spring Cloud 官方推出的網關解決方案&#xff0c;旨在替代 Netflix Zuul 1.x。其底層基于 Spring WebFlux Reactor 模型 構建&#xff0c;具備響應式、異步非阻塞的高性能特點。 1. 整體架構圖 ----------…

VMware Workstation Pro下Centos 7.9 安裝

背景系統安裝方案1、VMware安裝? ? 1.1、下載? ? 1.2、安裝 2、Centos 7.9 安裝? ? 2.1 、Centos7.9 iso 下載? ? 2.2、使用VMware 安裝? ? 2.2.1、VMware配置虛擬機? ? 2.2.2、Linux安裝 結語 背景 本文所在專欄的所有文章基于Centos7.9系統來演示&#xff0c;系…

我做個一個APP叫【圖影工具箱】:一站式解決視頻提取音頻和加水印的鴻蒙神器

在數字內容創作和日常使用手機的過程中&#xff0c;提取視頻音頻、處理圖片和視頻水印是一大需求。許多人在尋找合適的軟件時&#xff0c;往往試遍各種工具卻仍無法滿足需求。所以&#xff0c;我做了一款應用 —— 圖影工具箱&#xff0c;一站式解決這些令人頭疼的問題。 圖影…

【StarRocks系列】查詢語句執行全流程

目錄 StarRocks 查詢數據流程詳解 1. 提交查詢語句 2. FE 解析與優化 3. 選擇 BE 節點與數據路由 4. BE 數據讀取與計算 5. 結果返回 關鍵優化點總結 示例流程 流程圖 StarRocks 查詢數據流程詳解 StarRocks 采用分布式 MPP 架構&#xff0c;查詢流程涉及 FE&#xff…

HarmonyOS 5的分布式通信矩陣是如何工作的?

HarmonyOS 5 的分布式通信矩陣通過多層級技術協同實現跨設備高效協同&#xff0c;其核心工作機制如下&#xff1a; 一、核心架構&#xff1a;分布式軟總線 3.0? ?動態拓撲感知? 設備自動發現并構建最優傳輸路徑&#xff08;如手機與智慧屏優先采用 Wi-Fi P2P 直連&#xf…

自定義Django rest_framework中response的示例

在實際項目開發中&#xff0c;原有框架的response可能并不能完全滿足我們的需求。比如我們需要定義一些更加詳細的RESULT_CODE來說明情況。那么我們就可以基于原有的response進行自定義。 下面是一個自定義Django rest_framework中response的示例 # -*- coding:utf-8 -*- imp…