Doris如何做到将查询性能提升100倍

文摘   2024-11-07 00:00   重庆  

更多趣文请关注一臻数据
“ 

你是否遇到过这样的困扰:明明数据就在那里,却要等好久好久才能查出来;眼睁睁看着数据量越来越大,系统却越来越慢。这些问题在电商搜索、用户画像、日志分析等场景中太常见了。 

其实,性能慢并不可怕,可怕的是不知道如何优化。最近在一个电商项目中,我们就遇到了典型的"数据量暴增、查询变慢"的问题。 

通过对数据库索引的深入优化,我们把查询速度从好几秒提升到了毫秒级,用户体验得到了质的飞跃。 

今天,和大家分享这次优化背后的技术细节和实战经验。无论你是刚接触数据分析的新手,还是经验丰富的老手,相信都能从中获得一些启发。让我们一起聊聊如何让海量数据查询"飞"起来!

Apache Doris索引进化论

最近在一个电商项目中,阿华遇到一个棘手的性能问题:用户反馈商品搜索太慢了。当时数据量已经增长到了亿级别,普通的模糊查询需要扫描大量数据,响应时间长达数秒。这让我想起了Apache Doris强大的索引能力,尤其是它2.0版本推出的倒排索引特性。

经过一番调优后,我们的查询性能提升了近100倍。这次经历让我对Doris的索引体系有了更深的认识。在这篇文章中,我想跟大家分享一下Doris中不同类型索引的独特魅力。

在Doris的世界里,索引就像是数据的导航员。它们通过不同的方式,帮助查询快速定位到目标数据。整个索引体系分为两大阵营:点查索引和跳数索引。点查索引擅长精确定位,跳数索引则善于大面积过滤。

点查索引中的前缀索引,是Doris与生俱来的天赋。它按照排序键每1024行建立一个索引项,就像在书中每隔几页放一个书签。当你要找特定内容时,先找到最近的书签,再往后翻几页就能找到。

倒排索引是点查索引家族的新秀(备注:之前的 BITMAP 索引已经被更强的倒排索引取代)。它建立了值到行号的映射关系,就像一本书的索引页,记录了每个关键词在哪些页面出现过。最令人惊叹的是,它还支持分词检索,让模糊查询也能跑得飞快。

跳数索引则包括了ZoneMap索引和BloomFilter索引。ZoneMap索引就像是数据的体检报告,记录了每个数据块的统计信息。查询时先看报告,如果这个块的数据范围不符合要求,就直接跳过。BloomFilter索引则像是数据的门卫,能快速判断一个值是不是可能存在。

在深入探讨这些索引的技术细节之前,我想先分享一个有趣的观察:

Doris的索引设计非常贴合人类的思维方式。就像我们在图书馆找书,可能先看书架编号(前缀索引),再查字典索引(倒排索引),最后通过快速浏览(跳数索引)找到目标。这种自然的检索模式,在Doris中被优雅地实现了。

文本检索的"及时雨"

在一次处理社交媒体数据的项目中,我们需要分析用户评论中的热点话题。数据量达到了几亿条,传统的LIKE模糊匹配几乎无法使用。这时,Doris的倒排索引展现出了惊人的威力。

倒排索引的核心思想是重构查询路径。传统的查询方式是拿着关键词去一条条匹配数据,就像翻书一样从头翻到尾。而倒排索引则是预先建立了词到文档的映射表,就像书的索引页,直接告诉你关键词在哪些页面出现过。

Doris的倒排索引支持多种分词策略:

  • 英文分词器(english): 按空格和标点分词,性能最优
  • 中文分词器(chinese): 智能中文分词,支持细粒度和粗粒度两种模式
  • 多语言分词器(unicode): 支持中英文混合、邮箱、IP地址等复杂场景

分词后的处理也很智能。比如可以通过配置lower_case实现大小写不敏感的检索,通过ignore_above控制索引的字符串长度限制。这些细节的打磨,让倒排索引在实战中表现出色。

在查询语法上,倒排索引提供了丰富的匹配模式:

-- 任意匹配关键词
SELECT * FROM table WHERE content MATCH_ANY 'apache doris';

-- 同时包含多个关键词
SELECT * FROM table WHERE content MATCH_ALL 'apache olap';

-- 短语精确匹配
SELECT * FROM table WHERE content MATCH_PHRASE 'apache doris';

-- 支持通配符的前缀匹配
SELECT * FROM table WHERE content MATCH_PHRASE_PREFIX 'apache d';

在社交媒体数据分析项目中,我们用MATCH_ALL实现了多关键词的组合查询,查询耗时从原来的数秒降到了毫秒级。用MATCH_PHRASE_PREFIX实现了搜索提示功能,极大提升了用户体验。

一个特别有趣的发现是,倒排索引不仅支持文本检索,还能加速普通的等值、范围查询。它完全可以替代传统的BITMAP索引,而且功能更强大。唯一需要注意的是,FLOAT和DOUBLE这样的浮点类型不支持倒排索引,需要改用DECIMAL类型。

这里分享一个实战技巧:在创建倒排索引时,要根据数据特点选择合适的分词器。如果是纯英文或者固定分隔符的数据,用english分词器就够了;如果有中文内容,可以用chinese分词器;如果数据格式比较复杂,建议用unicode分词器。

不同的分词器会影响索引的大小和查询性能。我们可以用TOKENIZE函数预览分词效果:

SELECT TOKENIZE('Apache Doris OLAP''"parser"="english"');
SELECT TOKENIZE('阿帕奇Doris数据库''"parser"="chinese"');

这样就能直观地看到分词结果,选择最适合业务场景的配置。

倒排索引的维护也很灵活。可以在建表时指定,也可以后续通过CREATE/ALTER INDEX添加。最棒的是,添加索引时支持增量构建,不需要重写已有数据。这在生产环境中非常实用。我看过一个案例,1亿行数据的表增加倒排索引只用了几分钟,期间查询完全不受影响。

让查询飞起来的艺术

记得有一次,我们接到一个日志分析平台的性能优化需求。这个平台每天处理上千万条日志,用户经常需要按时间范围筛选,同时搜索特定的错误信息。起初查询响应时间长达30秒,严重影响了运维人员的工作效率。

经过分析,我们设计了一套组合拳:

CREATE TABLE error_logs (
    log_time DATETIME,
    level STRING,
    message STRING,
    trace_id STRING,
    service STRING,
    INDEX idx_time(log_time) USING INVERTED,
    INDEX idx_level(level) USING INVERTED,
    INDEX idx_message(message) USING INVERTED PROPERTIES("parser"="unicode"),
    INDEX idx_service(service) USING INVERTED
)
DUPLICATE KEY(trace_id);

这里使用unicode分词器处理message列,是因为错误信息中经常包含各种特殊字符和混合文本。同时,我们没有对trace_id建立倒排索引,而是将它设为排序键,利用前缀索引加速精确查询。

优化后的查询性能令人惊喜:

  • 按时间范围过滤:从5秒降到200ms
  • 错误关键词搜索:从30秒降到500ms
  • 多条件组合查询:从1分钟降到1秒内

灵活运用support_phrase属性。如果业务需要频繁进行短语匹配,打开support_phrase可以提升MATCH_PHRASE的性能,代价是占用更多存储空间。这是一个典型的空间换时间的权衡。

索引效果如何,可以通过查询的Profile信息来评估:

  • InvertedIndexFilterTime:索引过滤耗时
  • RowsInvertedIndexFiltered:索引过滤掉的行数

监控这些指标,能帮助我们判断索引是否真的在发挥作用。

还有一个经常被忽视的细节:表的模型选择会影响索引的使用范围。DUPLICATE和开启了Merge-on-Write的UNIQUE表可以在任意列上建立倒排索引。而AGGREGATE和普通UNIQUE表只能在Key列上建索引,这是因为这两种模型需要读取所有数据做合并。

在处理时序数据时,我发现一个有趣的组合:把时间列放在排序键的第一位,同时对它建立倒排索引。这样时间范围查询既能用到前缀索引,又能用到倒排索引,查询优化器会选择最优的执行计划。

升级到Doris 2.0后,倒排索引带来的不仅是性能提升,更是新的可能性。比如我们实现了一个简单的搜索建议功能:

SELECT DISTINCT keyword 
FROM search_logs 
WHERE keyword MATCH_PHRASE_PREFIX 'ap'
ORDER BY count() DESC 
LIMIT 10;

这个查询能快速返回以"ap"开头的热门搜索词,响应时间控制在10ms以内,用户体验堪比专业的搜索引擎。

难能可贵的是,Doris的索引优化是在不断进化的。从最初的前缀索引、位图索引,到现在的倒排索引体系,每一步演进都在解决实际问题。这让我对Doris的未来更有期待。

掌握这些索引技巧,就像给数据库装上了"火箭推进器"。当然,技术是在不断发展的,我们永远要保持学习的心态。期待在下一篇文章中,与大家分享更多Doris的心得小结。



 一臻数据致力于大数据AI时代的前沿内容分享,会持续分享更多有趣有用有态度的知识。同时也欢迎大家投稿,共建共进,帮助圈友们冲破认知壁垒,实现自我提升!

另外,一臻整理了一份《Apache Doris知识库》,其中包含 Apache Doris 学习资料、方案中心、企业实践  问题指南 等内容,会持续更新,欢迎关注公众号,免费领取

资料获取 🔗 欢迎扫描下方二维码图片 加入【Apache Doris社区】免费领取❗️




往期推荐

走进开源,拥抱开源

大数据平台开发规范示例

大数据仓库开发规范示例

大数据质量管制规范示例

Flink CDC 1.0至3.0回忆录

【Apache Doris】Manager 极致丝滑地运维管理

【Apache Doris】如何一键实现MySQL万表整库同步?

【Apache Doris】如何实现高并发点查?(原理+实践全析)

为什么Apache Doris适合做大数据的复杂计算,MySQL不适合?

如何正确地使用ChatGPT(角色扮演+提示工程)

超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用)



 

点击下方蓝字关注一臻数据

大数据技能圈
分享大数据前沿技术,实战代码,详细文档
 最新文章