pinot索引
Pinot目前支持以下索引技术,其中每种技术在不同的查询场景中都有各自的优势。默认情况下,Pinot将对每个列使用 dictionary-encoded(字典编码) forward index(前置索引)
Forward Index
Dictionary-Encoded Forward Index with Bit Compression (Default)
对于列中的每个惟一值,我们为其分配一个id,并从id构建一个字典。然后在前置索引中,我们只存储位压缩的id,而不存储值。
字典编码的唯一值很少,可以显著提高存储的空间效率。
下图显示了包含 integer 和 string 类型的两列的字典编码。正如在colA中看到的,字典编码将为重复的值节省大量空间。另一方面,colB没有重复的数据, 在这种情况下,字典编码不会压缩很多数据,因为列中有很多惟一的值。对于字符串类型,我们选择最长值的长度,并将其用作dictionary的固定长度值数组的长度。在这种情况下,如果一个列有大量惟一值,填充开销可能会很大。

Raw Value Forward Index
与字典编码的前向索引不同,原始值前置索引直接存储值而不是id。
如果没有字典,可以为每个值获取跳过字典查找步骤。另外,索引可以利用值的良好局部性,从而提高扫描大量值的性能。
应用原始值前向索引的典型用例是,当列有大量惟一值且字典不提供太多压缩时。正如上面关于字典编码的图表所示,用字典扫描值涉及大量的随机访问,因为我们需要执行字典查找。
另一方面,我们可以使用原始值前向索引顺序扫描值,如果应用得当,这可以极大地提高性能。

通过在表配置中将原始值前置索引设置为
{"tableIndexConfig": {"noDictionaryColumns": ["column_name",...],...}}
Sorted Forward Index with Run-Length Encoding
在对列进行物理排序时,Pinot在字典编码的基础上使用具有运行长度编码的排序前置索引。我们不是为每个文档id保存字典id,而是为每个值存储一对开始和结束文档id。(为了简单起见,下图不包括字典编码层。)

排序前置索引具有良好的压缩和数据局部性的优点。排序后的正向索引也可以用作反向索引。
可以通过在表配置中将已排序的索引设置为
{"tableIndexConfig": {"sortedColumn": ["column_name"],...}}
Realtime server在内部生成段时,将对sortedColumn上的数据进行排序。对于离线推送,在运行Pinot段转换和推送作业之前,需要对输入数据进行排序。
如果应用正确,可以在段元数据中找到以下信息。
$ grep memberId
column.memberId.isSorted = true
Inverted Index (only available with dictionary-encoded indexes)
Bitmap Inverted Index
当为一个列启用了反向索引时,Pinot维护一个从每个值到位图的映射,这使得值查找成为常数时间。 当您有一个经常用于过滤的列时,添加反向索引将极大地提高性能。
通过在表配置中将表设置为
{"tableIndexConfig": {"invertedIndexColumns": ["column_name",...],...}}
Sorted Inverted Index
排序的前置索引可以直接用作反向索引,具有log(n)时间查找功能,并且可以从数据位置获益。
对于下面的示例,如果查询在memberId上有一个过滤器,Pinot将对memberId值执行二分查找,以找到对应过滤值的docid范围对。如果查询需要在过滤后扫描其他列的值,则docId范围内的值将被定位在一起;因此,我们可以从数据局部性中获益良多。

排序索引比倒排索引性能好得多;但是,它只能应用于一个列。当反向索引的查询性能不够好,并且大多数查询在特定的列上有一个过滤器(例如memberId)时,排序索引可以提高查询性能。
Advanced Index
Star-Tree Index
与其他在单列上工作的索引技术不同,星型树索引构建在多个列上,并利用预先聚合的结果显著减少要处理的值的数量,从而提高查询性能。
Notes on Index Tuning
如果您的用例没有面临严格的低延迟需求,那么反向索引对于大多数用例来说就足够好了。我们建议从添加反向索引开始,如果查询执行得不够好,用户可以考虑使用更高级的索引,如已排序的列和星型树索引
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
