搞大数据开发的都知道,想要在海量数据里快速查数据,就像在星图里找一颗特定的星星,贼费劲。不外别慌,数据库索引就是咱们的 “定位神器”,能让查询服从直接腾飞!就拿 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!=YESYESNONONOINYESYESYESYESNONOT INYESYESNONONO>, >=, <, <=, BETWEENYESYESYESNONOIS NULLYESYESYESNONOIS NOT NULLYESYESNONONOLIKENONONONOYESMATCH, MATCH_*NOYESNONONOarray_containsNOYESNONONOarray_overlapsNOYESNONONOis_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 INDEX和ALTER 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_ANY、MATCH_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 INDEX或ALTER 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,索引见效了没,别做了和没做一样,就尬住了 。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|