Apache Doris 索引的全面剖析與使用指南

搞大數據開發的都知道,想要在海量數據里快速查數據,就像在星圖里找一顆特定的星星,賊費勁。不過別慌,數據庫索引就是咱們的 “定位神器”,能讓查詢效率直接起飛!就拿 Apache Doris 這個超火的分析型數據庫來說,它支持好幾種索引,每種都有自己的 “獨門絕技”,能在不同查詢場景下大顯身手。今天就帶大家好好研究下 Apache Doris 的索引,看看它到底是怎么做到這么牛的!
在這里插入圖片描述

一、索引的分類與原理

(一)點查索引:精準狙擊數據點

前綴索引:排序鍵上的 “捷徑”

Apache Doris 的數據存儲采用類似 SSTable 的有序結構,按照指定列排序存儲。在建表時,如 Aggregate、Unique 和 Duplicate 三種數據模型,會依據各自建表語句中的 Aggregate Key、Unique Key 和 Duplicate Key 指定列進行排序。這些排序鍵就像是書架上排列整齊的書籍類別標簽,而前綴索引則是在這些排序鍵基礎上建立的稀疏索引。

想象一下,每 1024 行數據組成一個邏輯數據塊,就像一個書架分區。每個分區在前綴索引表中有一個索引項,這個索引項就像是分區的 “小目錄”,其內容為該分區中第一行數據排序列組成的前綴,當查詢涉及這些排序列時,系統可以通過這個小巧的 “目錄” 快速定位到相關的數據塊,就如同通過書架分區目錄快速找到所需書籍類別,大大減少了搜索范圍,從而加速查詢。

注意??Doris的前綴索引長度不超過 36 字節。

例如,當表的排序列為 user_id(8 Bytes)、age(4 Bytes)、message(VARCHAR (100))等,前綴索引可能為 user_id + age + message 的前 20 字節(若總長度未超 36 字節)。當查詢條件為SELECT * FROM table WHERE user_id = 1829239 and age = 20;時,前綴索引能夠快速定位到包含符合條件數據的邏輯數據塊,查詢效率遠高于SELECT * FROM table WHERE age = 20;,因為后者無法有效利用前綴索引。

倒排索引:信息檢索的 “關鍵詞定位器”

從 2.0.0 版本起,Doris 引入了倒排索引這一強大工具,它在信息檢索領域有著舉足輕重的地位。在 Doris 的世界里,表的一行如同一份文檔,一列則是文檔中的一個字段。倒排索引就像是一個高效的 “關鍵詞定位器”,將文本分解成一個個詞,構建詞到文檔編號(即表中的行)的索引。

例如,對于一個包含用戶評論的表,對評論列創建倒排索引后,當我們要查詢包含特定關鍵詞(如 “OLAP”)的評論時,倒排索引可以快速定位到包含該關鍵詞的行。它不僅能加速字符串類型的全文檢索,支持多種關鍵詞匹配方式,如同時匹配多個關鍵字(MATCH_ALL)、匹配任意一個關鍵字(MATCH_ANY)、短語查詢(MATCH_PHRASE)等,還能加速普通等值、范圍查詢,替代了之前的 BITMAP 索引功能。在存儲上,倒排索引使用獨立文件,與數據文件一一對應但物理分離,這使得創建和刪除索引無需重寫數據文件,大大降低了處理開銷。

注意??,存在精度問題的浮點數類型(FLOAT 和 DOUBLE)以及部分復雜數據類型(如 MAP、STRUCT 等部分類型)暫不支持倒排索引。

(二)跳數索引:智能跳過 “無關數據塊”

ZoneMap 索引:數據塊的 “統計偵探”

ZoneMap 索引如同一位默默工作的 “統計偵探”,自動維護每一列的統計信息。對于每一個數據文件(Segment)和數據塊(Page),它都會記錄下最大值、最小值以及是否有 NULL 值。當進行等值查詢、范圍查詢或 IS NULL 查詢時,它可以根據這些統計信息迅速判斷該數據文件或數據塊是否可能包含滿足條件的數據。如果判斷不包含,就像偵探排除一個無關線索一樣,直接跳過該文件或數據塊不讀取,從而減少 I/O 操作,加速查詢。

例如,在一個包含用戶年齡的表中,當查詢年齡在某個范圍內的數據時,ZoneMap 索引可以通過數據塊的年齡最大值和最小值,快速排除那些明顯不滿足條件的數據塊,提高查詢效率。

BloomFilter 索引:基于概率的 “快速篩子”

BloomFilter 索引是基于 BloomFilter 算法的一種跳數索引,它就像是一個高效的 “快速篩子”。BloomFilter 是一種空間效率高的概率型數據結構,由一個超長的二進制位數組和一系列哈希函數組成。在 Doris 中,BloomFilter 索引以數據塊(page)為單位構建。寫入數據時,數據塊中的每個值經過哈希存入對應 BloomFilter;查詢時,根據等值條件的值判斷 BloomFilter 是否包含該值,若不包含則跳過對應數據塊。

例如,在一個包含大量用戶 ID 的表中,對用戶 ID 列創建 BloomFilter 索引后,當查詢特定用戶 ID 時,如果 BloomFilter 判斷該用戶 ID 不在某個數據塊對應的 BloomFilter 中,就可以直接跳過該數據塊,無需讀取,大大減少了 I/O。

注意??:它只對 IN 和 = 的等值查詢有效,且不支持 Tinyint、Float、Double 類型列,對低基數字段加速效果有限。

NGram BloomFilter 索引:文本 LIKE 查詢的 “助力器”

NGram BloomFilter 索引專門為文本 LIKE 查詢而生,是文本查詢的 “助力器”。它與 BloomFilter 索引類似,但存入 BloomFilter 的不是原始文本值,而是對文本進行 NGram 分詞后的每個詞。對于 LIKE 查詢,將 LIKE 的 pattern 也進行 NGram 分詞,判斷每個詞是否在 BloomFilter 中,若某個詞不在,則對應的數據塊不滿足 LIKE 條件,可跳過該數據塊。

例如,在一個存儲產品描述的表中,對描述列創建 NGram BloomFilter 索引后,當查詢包含特定短語(如 “super awesome”)的產品描述時,它可以快速篩選出可能包含該短語的數據塊,加速查詢。但它只支持字符串列,且要求 LIKE pattern 中的連續字符個數大于等于索引定義的 NGram 中的 N。

二、索引特點詳細對比

不同類型的索引各有千秋,也存在一定局限,讓我們通過表格直觀對比一下:

類型索引優點局限
點查索引前綴索引內置索引,性能最好一個表只有一組前綴索引
點查索引倒排索引支持分詞和關鍵詞匹配,任意列可建索引,多條件組合,持續增加函數加速索引存儲空間較大,與原始數據相當
跳數索引ZoneMap 索引內置索引,索引存儲空間小支持的查詢類型少,只支持等于、范圍
跳數索引BloomFilter 索引比 ZoneMap 更精細,索引空間中等支持的查詢類型少,只支持等于
跳數索引NGram BloomFilter 索引支持 LIKE 加速,索引空間中等支持的查詢類型少,只支持 LIKE 加速

三、索引加速的運算符和函數列表

了解索引對不同運算符和函數的支持,有助于我們在查詢中更好地利用索引加速:

運算符 / 函數前綴索引倒排索引ZoneMap 索引BloomFilter 索引NGram BloomFilter 索引
=YESYESYESYESNO
!=YESYESNONONO
INYESYESYESYESNO
NOT INYESYESNONONO
>, >=, <, <=, BETWEENYESYESYESNONO
IS NULLYESYESYESNONO
IS NOT NULLYESYESNONONO
LIKENONONONOYES
MATCH, MATCH_*NOYESNONONO
array_containsNOYESNONONO
array_overlapsNOYESNONONO
is_ip_address_in_rangeNOYESNONONO

四、索引使用指南

(一)前綴索引選擇建議

選擇最頻繁過濾字段:因為一個表只有一組前綴索引,所以要將查詢中最常用于 WHERE 過濾條件的字段作為 Key。例如,在一個用戶行為分析表中,如果經常根據用戶 ID 進行查詢,那么將用戶 ID 作為前綴索引的 Key 列是明智之舉。

字段順序很關鍵:越常用的字段越放在前面,因為前綴索引只對 WHERE 條件中字段在 Key 的前綴中才有效。比如,查詢條件經常是WHERE user_id = 123 AND age = 25,那么建表時將 user_id 放在前面作為排序列,能更好地利用前綴索引加速查詢。

(二)其他索引選擇建議

非 Key 字段過濾:對非 Key 字段如有過濾加速需求,首選建倒排索引,因其適用面廣,可多條件組合。例如,在一個包含用戶評論和評分的表中,若需要根據評論內容和評分范圍同時進行查詢過濾,倒排索引可以很好地滿足需求。

字符串 LIKE 匹配:如果有字符串 LIKE 匹配需求,可再加一個 NGram BloomFilter 索引。比如在產品描述搜索場景中,使用 NGram BloomFilter 索引能有效加速 LIKE 查詢。

索引存儲空間敏感:當對索引存儲空間很敏感時,可將倒排索引換成 BloomFilter 索引。例如,在一個存儲海量低基數用戶屬性數據的表中,BloomFilter 索引在滿足等值查詢加速需求的同時,能減少存儲空間占用。

(三)性能優化與分析

如果性能不及預期,可通過 QueryProfile 分析索引過濾掉的數據量和消耗的時間,具體參考各個索引的詳細文檔。例如,通過查看 RowsKeyRangeFiltered(前綴索引過濾掉的行數)、RowsInvertedIndexFiltered(倒排索引過濾掉的行數)等指標,評估索引的過濾效果,進而優化索引設計。

五、索引的管理與使用

(一)前綴索引

管理:前綴索引無需專門語法定義,建表時自動取表的 Key 的前 36 字節作為前綴索引。

使用:用于加速 WHERE 條件中的等值和范圍查詢,能加速時自動生效,無特殊語法。例如,SELECT * FROM table WHERE user_id = 123 AND age > 20;這樣的查詢,若 user_id 和 age 是排序列,前綴索引可自動發揮作用。

(二)倒排索引

管理

建表時定義:在建表語句中,在 COLUMN 定義之后進行索引定義,如CREATE TABLE table_name (column_name1 TYPE1, column_name2 TYPE2, INDEX idx_name1(column_name1) USING INVERTED [PROPERTIES(...)] [COMMENT 'your comment']);,需指定索引列名、索引類型(USING INVERTED),還可設置分詞器等額外屬性。

已有表增加:支持CREATE INDEXALTER TABLE ADD INDEX兩種語法,新增索引定義后,新寫入數據會生成倒排索引,存量數據需使用BUILD INDEX觸發構建。例如,CREATE INDEX idx_name ON table_name(column_name) USING INVERTED;BUILD INDEX index_name ON table_name;

已有表刪除:使用DROP INDEX idx_name ON table_name;ALTER TABLE table_name DROP INDEX idx_name;刪除倒排索引。

使用

全文檢索關鍵詞匹配:通過MATCH_ANYMATCH_ALL等完成,如SELECT * FROM table_name WHERE column_name MATCH_ANY 'keyword1 ...';

全文檢索短語匹配:通過MATCH_PHRASE完成,如SELECT * FROM table_name WHERE content MATCH_PHRASE 'keyword1 keyword2';,需注意設置support_phrase屬性。

普通等值、范圍、IN、NOT IN 查詢:正常 SQL 語句即可,如SELECT * FROM table_name WHERE id = 123;。可通過 Query Profile 中的 RowsInvertedIndexFiltered、InvertedIndexFilterTime 等指標分析倒排索引的加速效果。

(三)BloomFilter 索引

管理

建表時創建:通過表的 PROPERTIES “bloom_filter_columns” 指定哪些字段建 BloomFilter 索引,如PROPERTIES ("bloom_filter_columns" = "column_name1,column_name2");

已有表增加、刪除:通過 ALTER TABLE 修改表的 bloom_filter_columns 屬性完成,如ALTER TABLE table_name SET ("bloom_filter_columns" = "column_name1,column_name2,column_name3");增加索引,ALTER TABLE table_name SET ("bloom_filter_columns" = "column_name2,column_name3");刪除索引。

使用:用于加速 WHERE 條件中的等值查詢,自動生效,無特殊語法。可通過 Query Profile 中的 RowsBloomFilterFiltered、BlockConditionsFilteredBloomFilterTime 等指標分析加速效果。

(四)NGram BloomFilter 索引

管理

創建:在建表語句中 COLUMN 定義之后定義索引,如INDEX idx_column_name (column_name) USING NGRAM_BF PROPERTIES("gram_size"="3", "bf_size"="1024") COMMENT 'username ngram_bf index',需指定索引列名、索引類型(USING NGRAM_BF)及分詞相關屬性。

查看:使用SHOW CREATE TABLE table_name;SHOW INDEX FROM idx_name;查看索引。

刪除:使用ALTER TABLE table_ngrambf DROP INDEX idx_ngrambf;刪除索引。

修改:使用CREATE INDEXALTER TABLE ADD INDEX語法修改索引定義。

使用:用于加速 LIKE 查詢,如SELECT count() FROM table1 WHERE message LIKE '%error%';。可通過 Query Profile 中的 RowsBloomFilterFiltered、BlockConditionsFilteredBloomFilterTime 等指標分析加速效果。

六、總結

總之,Apache Doris 索引體系豐富強大,多種索引各有優勢。前綴索引依排序結構定位數據,倒排索引助力全文檢索,ZoneMap 索引借統計信息跳過無關數據塊,BloomFilter 索引和 NGram BloomFilter 索引分別加速等值和文本 LIKE 查詢。只要深入了解其原理、場景及使用方法,就能按需精準選擇,讓 Doris 在數據查詢中性能全開,無論是海量數據點查還是復雜文本檢索,都能輕松拿捏,實在搞不定,看看profile,索引生效了沒,別做了和沒做一樣,就尬住了 。

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

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

相關文章

docker file中ADD命令的介紹

在 Docker 的世界里&#xff0c;Dockerfile 是一個用于定義鏡像內容和行為的腳本文件。其中&#xff0c;ADD 指令是 Dockerfile 中一個非常重要的命令&#xff0c;用于將文件或目錄從主機文件系統復制到容器的文件系統中。本文將詳細介紹 ADD 指令的作用、使用方式以及一些最佳…

從零到一:如何用阿里云百煉和火山引擎搭建專屬 AI 助手(DeepSeek)?

本文首發&#xff1a;從零到一&#xff1a;如何用阿里云百煉和火山引擎搭建專屬 AI 助手&#xff08;DeepSeek&#xff09;&#xff1f; 阿里云百煉和火山引擎都推出了免費的 DeepSeek 模型體驗額度&#xff0c;今天我和大家一起搭建一個本地的專屬 AI 助手。  阿里云百煉為 …

cpp中的繼承

一、繼承概念 在cpp中&#xff0c;封裝、繼承、多態是面向對象的三大特性。這里的繼承就是允許已經存在的類&#xff08;也就是基類&#xff09;的基礎上創建新類&#xff08;派生類或者子類&#xff09;&#xff0c;從而實現代碼的復用。 如上圖所示&#xff0c;Person是基類&…

【QT】QLinearGradient 線性漸變類簡單使用教程

目錄 0.簡介 1&#xff09;qtDesigner中 2&#xff09;實際執行 1.功能詳述 3.舉一反三的樣式 0.簡介 QLinearGradient 是 Qt 框架中的一個類&#xff0c;用于定義線性漸變效果&#xff08;通過樣式表設置&#xff09;。它可以用來填充形狀、背景或其他圖形元素&#xff0…

前端項目配置 Nginx 全攻略

在前端開發中&#xff0c;項目開發完成后&#xff0c;如何高效、穩定地將其部署到生產環境是至關重要的一步。Nginx 作為一款輕量級、高性能的 Web 服務器和反向代理服務器&#xff0c;憑借其出色的性能和豐富的功能&#xff0c;成為了前端項目部署的首選方案。本文將詳細介紹在…

網絡安全學習-常見web漏洞的滲xxx透以及防護方法

滲XX透測試 弱口令漏洞 漏洞描述 目標網站管理入口&#xff08;或數據庫等組件的外部連接&#xff09;使用了容易被猜測的簡單字符口令、或者是默認系統賬號口令。 滲XX透測試 如果不存在驗證碼&#xff0c;則直接使用相對應的弱口令字典使用burpsuite 進行爆破如果存在驗證…

網絡安全 機器學習算法 計算機網絡安全機制

&#xff08;一&#xff09;網絡操作系統 安全 網絡操作系統安全是整個網絡系統安全的基礎。操作系統安全機制主要包括訪問控制和隔離控制。 訪問控制系統一般包括主體、客體和安全訪問政策 訪問控制類型&#xff1a; 自主訪問控制強制訪問控制 訪問控制措施&#xff1a; 入…

2025網絡安全等級測評報告,信息安全風險評估報告(Word模板)

一、概述 1.1工作方法 1.2評估依據 1.3評估范圍 1.4評估方法 1.5基本信息 二、資產分析 2.1 信息資產識別概述 2.2 信息資產識別 三、評估說明 3.1無線網絡安全檢查項目評估 3.2無線網絡與系統安全評估 3.3 ip管理與補丁管理 3.4防火墻 四、威脅細類分析 4.1威脅…

Ubuntu22.04系統安裝Anaconda、CUDA和CUDNN

之前一直在Windows系統下使用Anaconda和CUDA加速&#xff0c;最近需要復現一個算法&#xff0c;文檔里面有Linux系統conda構建環境的教程。 本篇博文參考博文&#xff0c;記錄自己安裝的過程&#xff0c;便于以后需要。 目錄 1.Anaconda1.1 安裝包下載1.2 安裝軟件1.3 更新cond…

微信小程序調用火山方舟(字節跳動火山引擎)中的DeepSeek大模型

一、注冊火山引擎賬號&#xff0c;創建API Key和model&#xff08;接入點ID&#xff09; 1.注冊并登陸火山引擎賬號&#xff0c;網址為&#xff1a;https://console.volcengine.com/ 2.根據登陸后的頁面提示進行實名認證&#xff0c;實名認證后才能創建API Keyt和創建接入點。…

藍橋杯之日期題

文章目錄 1.藍橋杯必備知識點2. 題型13.需求2 1.藍橋杯必備知識點 藍橋杯是一個面向全國高校計算機相關專業學生的學科競賽&#xff0c;涵蓋多個賽道&#xff0c;常見的有軟件類&#xff08;如 C/C 程序設計、Java 軟件開發、Python 程序設計&#xff09;和電子類&#xff08;…

muduo網絡庫2

Muduo網絡庫&#xff1a;底層實質上為Linux的epoll pthread線程池&#xff0c;且依賴boost庫。 muduo的網絡設計核心為一個線程一個事件循環&#xff0c;有一個main Reactor負載accept連接&#xff0c;然后把連接分發到某個sub Reactor(采用輪詢的方式來選擇sub Reactor)&…

WinSCP 連接到 Ubuntu 虛擬機

要使用 WinSCP 連接到 Ubuntu 虛擬機&#xff0c;一般采用 SFTP 或 SCP 協議進行文件傳輸。以下是詳細步驟&#xff1a; 1. 確保虛擬機網絡可訪問 首先&#xff0c;你的 Ubuntu 虛擬機需要允許外部訪問&#xff1a; 如果使用 NAT 網絡&#xff1a;需要設置端口轉發&#xff0…

redis小記

redis小記 下載redis sudo apt-get install redis-server redis基本命令 ubuntu16下的redis沒有protected-mode屬性&#xff0c;就算sudo啟動&#xff0c;也不能往/var/spool/cron/crontabs寫計劃任務&#xff0c;感覺很安全 #連接到redis redis-cli -h 127.0.0.1 -p 6379 …

Docker核心概念

容器介紹 Docker 是世界領先的軟件容器平臺&#xff0c;所以想要搞懂 Docker 的概念我們必須先從容器開始說起。 什么是容器? 先來看看容器較為官方的解釋 一句話概括容器&#xff1a;容器就是將軟件打包成標準化單元&#xff0c;以用于開發、交付和部署。 容器鏡像是輕量…

阿里云可觀測全面擁抱 OpenTelemetry 社區

作者&#xff1a;古琦 在云計算、微服務、容器化等技術重塑 IT 架構的今天&#xff0c;系統復雜度呈指數級增長。在此背景下&#xff0c;開源可觀測性技術已從輔助工具演變為現代 IT 系統的"數字神經系統"&#xff0c;為企業提供故障預警、性能優化和成本治理的全方…

2025年2月科技熱點深度解析:AI競賽、量子突破與開源革命

引言 2025年的科技領域持續呈現爆發式增長&#xff0c;AI大模型競爭白熱化、量子計算商業化加速、開源工具生態繁榮成為本月最受關注的議題。本文結合最新行業動態&#xff0c;從技術突破、商業布局到開發者生態&#xff0c;全面解析當前科技熱點&#xff0c;為讀者提供深度洞…

idea創建第一個springboot程序

說明&#xff1a; 我計劃用idea&#xff0c;創建第一個springboot程序&#xff0c;但是作為新手完全不會弄&#xff0c;今天我就親自嘗試一邊&#xff0c;并且出一期詳細&#xff0c;完美的教程&#xff0c;親測可以運行 step1. 點擊file &#xff0c; 選new&#xff0c; 選…

半導體芯片制造中 W CVD(鎢化學氣相沉積)

半導體芯片制造中 W CVD&#xff08;鎢化學氣相沉積&#xff09; 的 Nucleation 解析 在鎢&#xff08;W&#xff09;化學氣相沉積&#xff08;CVD&#xff09;工藝中&#xff0c;Nucleation&#xff08;成核&#xff09; 是沉積過程的初始階段&#xff0c;指鎢原子或分子在基…

Three.js 入門(輔助、位移、父子關系、縮放旋轉、響應式布局)

本篇主要學習內容 : 三維坐標系與輔助坐標系物體位移與父子元素物體的縮放與物體的旋轉設置響應式畫布與全屏控制 點贊 關注 收藏 學會了 本文使用 Three.js 的版本&#xff1a;171 基于 Vue3vite開發調試 1.三維坐標系與輔助坐標系 1.1) 導入three和軌道控制器 // 導入…